Files
static-php-cli/assets/zh_develop_registry.md.BvRBmoGT.js
2026-05-11 05:18:54 +00:00

45 lines
12 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 的核心扩展机制。你可以把它理解成一个&quot;插件包&quot;:一个 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;"> # 也可以按需加载指定的类,支持数组格式或 {&quot;类名&quot;: &quot;文件路径&quot;} 映射格式</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>[&quot;ClassName&quot;]</code>,需已在 autoload 中可用)或键值映射格式(<code>{&quot;ClassName&quot;: &quot;path/to/file.php&quot;}</code>,加载器会自动 <code>require</code> 对应文件)。</p>`,14)])])}const g=a(t,[["render",l]]);export{o as __pageData,g as default};