Files
static-php-cli/docs/zh/develop/registry.md

5.2 KiB
Raw Blame History

Registry 与插件系统

概述

Registry注册表 是 StaticPHP 的核心扩展机制。你可以把它理解成一个"插件包":一个 Registry 由一个声明文件(spc.registry.yml和它所指向的配置文件、PHP 类共同组成描述了一组包的定义YAML 配置和对应的构建逻辑PHP 类)。构建系统在启动时会加载所有已注册的 Registry将它们的包定义合并后用于整个构建流程。

StaticPHP 本身携带一个内置的核心注册表(core),其中包含了 PHP 及相关扩展、库、构建工具等的全部定义。core 注册表的声明文件即项目根目录下的 spc.registry.yml,它描述了配置文件目录(config/pkg/config/artifact/)和构建类的 PSR-4 命名空间(src/Package/)之间的映射关系。

外部 Registry 只能定义 core 中尚不存在的新包,不能覆盖或修改核心注册表中已有的定义。根据你的需求,有以下三种方式来扩展或修改 StaticPHP 的构建能力:

  • 修改 core 注册表:直接修改 src/Packageconfig/pkg/ 下的文件,适用于希望将改动合并回 StaticPHP 主线的情况。请先阅读 贡献指南 中关于贡献新包的部分,再提交 PR。
  • Vendor 模式:将自定义包封装为一个独立的子注册表,以 Composer 包的形式分发,适用于需要私有包或希望以库的形式复用构建逻辑的场景。详见 扩展 StaticPHP
  • 外部注册表(SPC_REGISTRIES:通过环境变量 SPC_REGISTRIES 指定一个或多个外部注册表文件的路径StaticPHP 会在启动时加载它们。适用于临时扩展或不便打包为 Composer 包的场景,与其他包管理器的外部源机制类似。

Registry 定义文件

每个 Registry 都有一个声明文件,通常命名为 spc.registry.yml,位于项目根目录或 Composer 包的根目录下。文件格式支持 YAML.yml / .yaml)和 JSON.json)。文件中所有路径均相对于声明文件自身所在目录解析。

StaticPHP 在源码模式(直接 git clone会默认加载项目根目录下的 spc.registry.yml 作为核心注册表(core)。在 Vendor 模式下,会自动检测当前 Composer 包根目录下是否存在 spc.registry.yml,如果存在则加载为一个独立的注册表。通过 SPC_REGISTRIES 环境变量指定的外部注册表也必须包含一个有效的声明文件。

下面是一个包含所有可用字段的完整示例(参照 core 注册表):

# [必填] 注册表唯一名称,重复加载同名注册表时会自动跳过
name: my-registry

# [可选] Composer autoload 文件路径,外部注册表有自己的依赖时使用
autoload: vendor/autoload.php

# 包library / php-extension / target相关配置
package:
  # 包的 YAML 配置文件目录或具体文件路径,可以是数组
  config:
    - config/pkg/lib/
    - config/pkg/target/
    - config/pkg/ext/
  # 包构建类的 PSR-4 命名空间 → 目录路径映射,加载器会扫描目录下所有 PHP 类
  psr-4:
    Package: src/Package
  # 也可以按需加载指定的类,支持数组格式或 {"类名": "文件路径"} 映射格式
  # classes:
  #   - Package\Library\MyLib
  #   MyLib: src/Package/Library/MyLib.php

# 构建产物Artifact相关配置
artifact:
  # Artifact 的 YAML 配置文件目录或具体文件路径
  config:
    - config/artifact/
  # Artifact 自定义下载/解压类的 PSR-4 命名空间 → 目录路径映射
  psr-4:
    Package\Artifact: src/Package/Artifact
  # classes: ...(同 package.classes 格式)

# Doctor 环境检查项配置
doctor:
  # Doctor 检查项类的 PSR-4 命名空间 → 目录路径映射
  psr-4:
    StaticPHP\Doctor\Item: src/StaticPHP/Doctor/Item
  # classes: ...(同 package.classes 格式)

# 额外的 CLI 命令配置
command:
  # 自定义命令类的 PSR-4 命名空间 → 目录路径映射
  psr-4:
    Package\Command: src/Package/Command
  # classes: ...(同 package.classes 格式)

各顶层字段说明:

字段 必填 说明
name 注册表唯一名称,重复加载同名注册表时自动跳过
autoload Composer autoload 文件路径,适用于外部注册表携带自己的依赖时
package 包定义,含 YAML 配置(config)和构建类(psr-4 / classes
artifact Artifact 定义,含 YAML 配置(config)和自定义类(psr-4 / classes
doctor Doctor 检查项定义,仅含类加载(psr-4 / classes
command 额外的 CLI 命令定义,仅含类加载(psr-4 / classes

其中 psr-4classes 的区别:psr-4 会扫描整个目录下所有符合命名空间规则的 PHP 类并批量注册;classes 则用于精确指定某几个类,支持纯数组格式(["ClassName"],需已在 autoload 中可用)或键值映射格式({"ClassName": "path/to/file.php"},加载器会自动 require 对应文件)。