mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-04 15:25:41 +08:00
45 lines
12 KiB
JavaScript
45 lines
12 KiB
JavaScript
import{_ as a,c as i,o as n,aj as e}from"./chunks/framework.C2AwuPrQ.js";const o=JSON.parse('{"title":"Registry 与插件系统","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/registry.md","filePath":"zh/develop/registry.md"}'),t={name:"zh/develop/registry.md"};function l(p,s,c,d,h,k){return n(),i("div",null,[...s[0]||(s[0]=[e(`<h1 id="registry-与插件系统" tabindex="-1">Registry 与插件系统 <a class="header-anchor" href="#registry-与插件系统" aria-label="Permalink to “Registry 与插件系统”"></a></h1><h2 id="概述" tabindex="-1">概述 <a class="header-anchor" href="#概述" aria-label="Permalink to “概述”"></a></h2><p><strong>Registry(注册表)</strong> 是 StaticPHP 的核心扩展机制。你可以把它理解成一个"插件包":一个 Registry 由一个声明文件(<code>spc.registry.yml</code>)和它所指向的配置文件、PHP 类共同组成,描述了一组包的定义(YAML 配置)和对应的构建逻辑(PHP 类)。构建系统在启动时会加载所有已注册的 Registry,将它们的包定义合并后用于整个构建流程。</p><p>StaticPHP 本身携带一个内置的核心注册表(<code>core</code>),其中包含了 PHP 及相关扩展、库、构建工具等的全部定义。<code>core</code> 注册表的声明文件即项目根目录下的 <code>spc.registry.yml</code>,它描述了配置文件目录(<code>config/pkg/</code>、<code>config/artifact/</code>)和构建类的 PSR-4 命名空间(<code>src/Package/</code>)之间的映射关系。</p><p>外部 Registry 只能定义 <code>core</code> 中尚不存在的新包,不能覆盖或修改核心注册表中已有的定义。根据你的需求,有以下三种方式来扩展或修改 StaticPHP 的构建能力:</p><ul><li><strong>修改 <code>core</code> 注册表</strong>:直接修改 <code>src/Package</code> 和 <code>config/pkg/</code> 下的文件,适用于希望将改动合并回 StaticPHP 主线的情况。请先阅读 <a href="./../contributing/">贡献指南</a> 中关于贡献新包的部分,再提交 PR。</li><li><strong>Vendor 模式</strong>:将自定义包封装为一个独立的子注册表,以 Composer 包的形式分发,适用于需要私有包或希望以库的形式复用构建逻辑的场景。详见 <a href="./extending/">扩展 StaticPHP</a>。</li><li><strong>外部注册表(<code>SPC_REGISTRIES</code>)</strong>:通过环境变量 <code>SPC_REGISTRIES</code> 指定一个或多个外部注册表文件的路径,StaticPHP 会在启动时加载它们。适用于临时扩展或不便打包为 Composer 包的场景,与其他包管理器的外部源机制类似。</li></ul><h2 id="registry-定义文件" tabindex="-1">Registry 定义文件 <a class="header-anchor" href="#registry-定义文件" aria-label="Permalink to “Registry 定义文件”"></a></h2><p>每个 Registry 都有一个声明文件,通常命名为 <code>spc.registry.yml</code>,位于项目根目录或 Composer 包的根目录下。文件格式支持 YAML(<code>.yml</code> / <code>.yaml</code>)和 JSON(<code>.json</code>)。文件中所有路径均相对于声明文件自身所在目录解析。</p><p>StaticPHP 在源码模式(直接 git clone)下,会默认加载项目根目录下的 <code>spc.registry.yml</code> 作为核心注册表(<code>core</code>)。在 Vendor 模式下,会自动检测当前 Composer 包根目录下是否存在 <code>spc.registry.yml</code>,如果存在则加载为一个独立的注册表。通过 <code>SPC_REGISTRIES</code> 环境变量指定的外部注册表也必须包含一个有效的声明文件。</p><p>下面是一个包含所有可用字段的完整示例(参照 <code>core</code> 注册表):</p><div class="language-yaml"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [必填] 注册表唯一名称,重复加载同名注册表时会自动跳过</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">my-registry</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># [可选] Composer autoload 文件路径,外部注册表有自己的依赖时使用</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">autoload</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">vendor/autoload.php</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 包(library / php-extension / target)相关配置</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 包的 YAML 配置文件目录或具体文件路径,可以是数组</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">config/pkg/lib/</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">config/pkg/target/</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">config/pkg/ext/</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 包构建类的 PSR-4 命名空间 → 目录路径映射,加载器会扫描目录下所有 PHP 类</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> psr-4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> Package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">src/Package</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 也可以按需加载指定的类,支持数组格式或 {"类名": "文件路径"} 映射格式</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # classes:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # - Package\\Library\\MyLib</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # MyLib: src/Package/Library/MyLib.php</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 构建产物(Artifact)相关配置</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Artifact 的 YAML 配置文件目录或具体文件路径</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">config/artifact/</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Artifact 自定义下载/解压类的 PSR-4 命名空间 → 目录路径映射</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> psr-4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> Package\\Artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">src/Package/Artifact</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # classes: ...(同 package.classes 格式)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Doctor 环境检查项配置</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">doctor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Doctor 检查项类的 PSR-4 命名空间 → 目录路径映射</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> psr-4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> StaticPHP\\Doctor\\Item</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">src/StaticPHP/Doctor/Item</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # classes: ...(同 package.classes 格式)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 额外的 CLI 命令配置</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # 自定义命令类的 PSR-4 命名空间 → 目录路径映射</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> psr-4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
|
||
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> Package\\Command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">src/Package/Command</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # classes: ...(同 package.classes 格式)</span></span></code></pre></div><p>各顶层字段说明:</p><table tabindex="0"><thead><tr><th>字段</th><th>必填</th><th>说明</th></tr></thead><tbody><tr><td><code>name</code></td><td>✅</td><td>注册表唯一名称,重复加载同名注册表时自动跳过</td></tr><tr><td><code>autoload</code></td><td></td><td>Composer autoload 文件路径,适用于外部注册表携带自己的依赖时</td></tr><tr><td><code>package</code></td><td></td><td>包定义,含 YAML 配置(<code>config</code>)和构建类(<code>psr-4</code> / <code>classes</code>)</td></tr><tr><td><code>artifact</code></td><td></td><td>Artifact 定义,含 YAML 配置(<code>config</code>)和自定义类(<code>psr-4</code> / <code>classes</code>)</td></tr><tr><td><code>doctor</code></td><td></td><td>Doctor 检查项定义,仅含类加载(<code>psr-4</code> / <code>classes</code>)</td></tr><tr><td><code>command</code></td><td></td><td>额外的 CLI 命令定义,仅含类加载(<code>psr-4</code> / <code>classes</code>)</td></tr></tbody></table><p>其中 <code>psr-4</code> 和 <code>classes</code> 的区别:<code>psr-4</code> 会扫描整个目录下所有符合命名空间规则的 PHP 类并批量注册;<code>classes</code> 则用于精确指定某几个类,支持纯数组格式(<code>["ClassName"]</code>,需已在 autoload 中可用)或键值映射格式(<code>{"ClassName": "path/to/file.php"}</code>,加载器会自动 <code>require</code> 对应文件)。</p>`,14)])])}const g=a(t,[["render",l]]);export{o as __pageData,g as default};
|