Files
static-php-cli/assets/zh_develop_package-model.md.DDw9ZCCd.js
2026-07-16 06:25:16 +00:00

171 lines
46 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{G as e,K as t,at as n,j as r}from"./chunks/framework.DrNIf5Lg.js";var i=JSON.parse(`{"title":"Package 模型","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/package-model.md","filePath":"zh/develop/package-model.md"}`),a={name:`zh/develop/package-model.md`};function o(r,i,a,o,s,c){return n(),e(`div`,null,[...i[0]||=[t(`<h1 id="package-模型" tabindex="-1">Package 模型 <a class="header-anchor" href="#package-模型" aria-label="Permalink to “Package 模型”"></a></h1><h2 id="package-定义" tabindex="-1">Package 定义 <a class="header-anchor" href="#package-定义" aria-label="Permalink to “Package 定义”"></a></h2><p>Package 是 StaticPHP 构建系统中的核心概念,代表一个可构建/可安装的单元,如 PHP 扩展、库、构建目标等。</p><p>每个 Package 包含构建信息、依赖关系、构建逻辑等,构成了 StaticPHP 的构建模型。Package 的定义主要通过 YAML/JSON 配置文件来实现。<code>core</code> Registry 的 Package 配置位于 <code>config/pkg/</code> 目录下,可选 recipe class 位于 <code>src/Package/</code> 对应的子目录中。</p><p>Package 分为五种类型:</p><ul><li><strong>php-extension</strong>PHP 扩展包,包含 PHP 扩展的构建信息和构建逻辑。</li><li><strong>library</strong>:依赖库 Package通常安装到 <code>buildroot/</code>,供其他 Package 编译和链接。</li><li><strong>target</strong>:构建目标包,代表最终的构建产物,如 PHP 二进制、curl 二进制等,继承自 <code>library</code> 包类型。</li><li><strong>virtual-target</strong>:虚构建目标包,代表一个抽象的构建目标,不直接对应构建产物,主要用于依赖管理和构建调度。</li><li><strong>tool</strong>:宿主机侧构建工具 Package单独安装在 <code>pkgroot/</code> 下,不作为链接期库依赖处理。</li></ul><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:#24292E;--shiki-dark:#E1E4E8;">{</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">pkg-name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">pkg-type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> ...</span></span></code></pre></div><h2 id="artifact-定义" tabindex="-1">Artifact 定义 <a class="header-anchor" href="#artifact-定义" aria-label="Permalink to “Artifact 定义”"></a></h2><p>Artifact 是独立于 Package 的定义,它包含构建包的源码归档文件或预构建的二进制文件。每个 Artifact 定义了下载 URL、解压方式、构建产物的文件路径等信息。一个 Package 可以通过 <code>artifact</code> 字段引用一个 Artifact以获取构建所需的源码或二进制文件。</p><p>简单来说,默认情况下,一个 Package 对应一个 Artifact如果多个 Package 共用一份源码时,可以定义一个 Artifact 供多个 Package 引用。Artifact 的定义位于 <code>config/artifact/</code> 目录下,对应的自定义下载/解压逻辑类位于 <code>src/Package/Artifact/</code> 目录下对于虚拟目标、PHP 内置扩展等特殊包类型Package 也可以不设置 Artifact 字段。</p><p>我们假设 <code>example-library-package</code> 是一个依赖库,它的源码归档文件托管在 <code>https://example.com/example-library.tar.gz</code>,则它的 Package 定义和 Artifact 定义可以如下所示:</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:#11782a;--shiki-dark:#85E89D;">example-library-package</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">library</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">url</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://example.com/example-library.tar.gz&#39;</span></span></code></pre></div><p>更多有关 Artifact 定义的内容,请参阅 <a href="./artifact-model.html">Artifact 模型</a> 章节。</p><h2 id="php-extension-包类型" tabindex="-1">php-extension 包类型 <a class="header-anchor" href="#php-extension-包类型" aria-label="Permalink to “php-extension 包类型”"></a></h2><p>php-extension Package 代表一个 PHP 扩展,它的配置文件位于 <code>config/pkg/ext/</code> 目录下。可选的 recipe class 通常放在 <code>src/Package/Extension/</code>,通过 <code>#[Extension]</code> 注册,并从 callback context 接收对应的 <code>PhpExtensionPackage</code>。当前 core recipe 支持继承 <code>PhpExtensionPackage</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:#11782a;--shiki-dark:#85E89D;">ext-lz4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">php-extension</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">git</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://github.com/kjdev/php-ext-lz4.git&#39;</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> rev</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">master</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> extract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">php-src/ext/lz4</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> license-files</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">LICENSE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> license</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">MIT</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends</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;">liblz4</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> php-extension</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> arg-type@unix</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;--enable-lz4@shared_suffix@ --with-lz4-includedir=@build_root_path@&#39;</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> arg-type@windows</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;--enable-lz4&#39;</span></span></code></pre></div><p><code>php-extension</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:#11782a;--shiki-dark:#85E89D;">ext-{ext-name}</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 包名必须以 ext- 前缀开头</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">php-extension</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # ── 通用字段 ─────────────────────────────────────────────────────────────</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;...&#39;</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选,人类可读的包描述</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> lang</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">c</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选扩展的实现语言c / c++ 等)</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> frameworks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选相关macOS框架依赖列表</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;{artifact-name}&#39;</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选;字符串时引用指定名称的 Artifact 定义,</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 对象时为内联 Artifact内置扩展无需此字段</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # depends / suggests / tools 支持 @windows / @unix / @linux / @macos 后缀</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选硬依赖列表库名直接写PHP 扩展需加 ext- 前缀)</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends@unix</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,仅 Unix 平台生效的硬依赖</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends@windows</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,仅 Windows 平台生效的硬依赖</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> suggests</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,可选依赖列表(格式同 depends</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> suggests@unix</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: []</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> tools</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,宿主机侧构建工具依赖,单独解析</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> tools@windows</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,特定平台的工具依赖</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # ── php-extension 专属字段(嵌套在 php-extension: 对象中)─────────────────</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> php-extension</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # arg-type 决定传递给 ./configure 的参数形式,支持平台后缀</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 支持的平台后缀:@unixLinux + macOS、@linux、@macos、@windows</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 优先级(以 Linux 为例arg-type@linux &gt; arg-type@unix &gt; arg-type无后缀</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 内置关键字:</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # enable → --enable-{extname}(默认值,未配置时使用)</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # enable-path → --enable-{extname}={buildroot}</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # with → --with-{extname}</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # with-path → --with-{extname}={buildroot}</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # custom/none → 不传递任何参数(由 PHP 类的 #[CustomPhpConfigureArg] 方法处理)</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 也可直接写完整参数字符串,支持以下占位符:</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # @build_root_path@ → BUILD_ROOT_PATHbuildroot 绝对路径)</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # @shared_suffix@ → 共享构建时展开为 =shared静态构建时为空</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # @shared_path_suffix@ → 共享构建时展开为 =shared,{buildroot},静态构建时为 ={buildroot}</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> arg-type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">enable</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> arg-type@unix</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;--enable-my-extension@shared_suffix@&#39;</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> arg-type@windows</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">with-path</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> zend-extension</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选true 表示这是 Zend 扩展(如 opcache、xdebug</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> build-shared</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选,是否允许构建为共享扩展(.so默认 true</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> build-static</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选,是否允许内联静态构建(编译进 PHP默认 true</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> build-with-php</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选true 表示该扩展通过 PHP 源码树一同编译(内置扩展使用)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # display-name 影响 smoke test 中 php --ri 的参数及许可证导出显示名称</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 不填时默认使用扩展名ext- 后缀部分);填空字符串则跳过 --ri 检查</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> display-name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;My Extension&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # os 限制该扩展仅在指定平台上可用,不在列表内的平台会拒绝构建</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选值Linux、Darwin、Windows</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> os</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">Linux</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">Darwin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span></code></pre></div><h2 id="library-包类型" tabindex="-1">library 包类型 <a class="header-anchor" href="#library-包类型" aria-label="Permalink to “library 包类型”"></a></h2><p>library Package 代表 openssl、zlib 等依赖库,可以从源码或预构建二进制安装。其配置文件位于 <code>config/pkg/lib/</code> 目录下。可选的 recipe class 通常放在 <code>src/Package/Library/</code>,通过 <code>#[Library]</code> 注册,并从 callback context 接收 <code>LibraryPackage</code>;不要求继承该类。</p><p>以 openssl 为例:</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:#11782a;--shiki-dark:#85E89D;">openssl</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">library</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ghrel</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">openssl/openssl</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">openssl.+\\.tar\\.gz</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> prefer-stable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> binary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">hosted</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> license-files</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">LICENSE.txt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> license</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">OpenSSL</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends</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;">zlib</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends@windows</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;">zlib</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">jom</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> headers</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;">openssl</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> static-libs@unix</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;">libssl.a</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">libcrypto.a</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> static-libs@windows</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;">libssl.lib</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">libcrypto.lib</span></span></code></pre></div><p><code>library</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:#24292E;--shiki-dark:#E1E4E8;">{</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">lib-name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">library</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # library 或 targettarget 继承 library 的所有字段)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # ── 通用字段 ─────────────────────────────────────────────────────────────</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;...&#39;</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选,人类可读的包描述</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> license</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,从源码构建后复制的许可证内容</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">file</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # type 可为 file 或 text也可填写多个条目的列表</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">LICENSE</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> lang</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">c</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 可选库的实现语言c / c++ 等)</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> frameworks</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,相关框架标签列表</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;{artifact-name}&#39;</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 必填;字符串时引用指定名称的 Artifact 定义,对象时为内联 Artifact</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # depends / suggests / tools 支持 @windows / @unix / @linux / @macos 后缀</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,硬依赖列表(库名或 ext- 前缀的 PHP 扩展名)</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends@unix</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: []</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> depends@windows</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: []</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> suggests</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,可选依赖列表(格式同 depends</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> tools</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [] </span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"># 可选,仅构建时需要的 ToolPackage 名称</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> tools@windows</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: []</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # ── library / target 专属字段 ────────────────────────────────────────────</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 以下字段用于构建完成后验证产物是否已正确安装headers、static-libs、static-bins</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 支持 @unix / @windows / @linux / @macos 后缀</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 验证 buildroot/include/ 下是否存在指定头文件或目录</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 相对路径基于 buildroot/include/,绝对路径直接使用</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> headers</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;">openssl</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 对应 buildroot/include/openssl/</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">zlib.h</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 对应 buildroot/include/zlib.h</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> headers@unix</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;">ffi.h</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 验证 buildroot/lib/ 下是否存在指定静态库文件</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 相对路径基于 buildroot/lib/,绝对路径直接使用</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> static-libs@unix</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;">libssl.a</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> static-libs@windows</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;">libssl.lib</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 验证 buildroot/lib/pkgconfig/ 下是否存在指定 .pc 文件</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 仅在非 Windows 平台检查pkg-config 在 Windows 上不适用)</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> pkg-configs</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;">openssl</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 对应 buildroot/lib/pkgconfig/openssl.pc</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">libssl</span><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 自动补全 .pc 后缀</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 验证 buildroot/bin/ 下是否存在指定可执行文件</span></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 相对路径基于 buildroot/bin/,绝对路径直接使用</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> static-bins</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;">my-tool</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 包安装完成后注入到全局 PATH 的目录列表,支持路径占位符(见下方说明)</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> path</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;">&#39;{pkg_root_path}/rust/bin&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 包安装完成后设置的环境变量(覆盖已有值),支持路径占位符</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> env</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> MY_VAR</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;{build_root_path}/lib&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;"> # 包安装完成后追加到已有环境变量末尾的值,支持路径占位符</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> append-env</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> CFLAGS</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39; -I{build_root_path}/include&#39;</span></span></code></pre></div><p><code>path</code>、<code>env</code>、<code>append-env</code> 字段的字符串值中支持以下路径占位符:</p><table tabindex="0"><thead><tr><th>占位符</th><th>实际路径</th></tr></thead><tbody><tr><td><code>{build_root_path}</code></td><td>buildroot 目录(<code>buildroot/</code></td></tr><tr><td><code>{pkg_root_path}</code></td><td>pkgroot 目录(<code>pkgroot/</code></td></tr><tr><td><code>{working_dir}</code></td><td>工作目录(项目根目录)</td></tr><tr><td><code>{download_path}</code></td><td>下载缓存目录(<code>downloads/</code></td></tr><tr><td><code>{source_path}</code></td><td>解压源码目录(<code>source/</code></td></tr><tr><td><code>{spc_msys2_path}</code></td><td>MSYS2 根目录(<code>msys64/</code>)——仅 Windows</td></tr></tbody></table><h2 id="tool-包类型" tabindex="-1">tool 包类型 <a class="header-anchor" href="#tool-包类型" aria-label="Permalink to “tool 包类型”"></a></h2><p><code>tool</code> Package 表示构建其他 Package 时需要的可执行工具,而不是链接进最终 target 的库。Tool Package 可以使用预构建二进制,也可以从源码构建,默认安装在 <code>pkgroot/</code> 下的共享 <code>bin/</code> 或配置的子目录。其他 Package 通过顶层 <code>tools</code> 字段请求这些工具;该依赖集合与 <code>depends</code>、<code>suggests</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:#11782a;--shiki-dark:#85E89D;">nasm</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">tool</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> artifact</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> binary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> windows-x86_64</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">url</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;https://example.com/nasm-win64.zip&#39;</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> extract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> nasm.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;{pkg_root_path}/bin/nasm.exe&#39;</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> ndisasm.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;{pkg_root_path}/bin/ndisasm.exe&#39;</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> tool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> provides</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">nasm.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">ndisasm.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> binary-subdir</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">bin</span></span>
<span class="line"><span style="--shiki-light:#11782a;--shiki-dark:#85E89D;"> min-version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;2.16&#39;</span></span></code></pre></div><p>嵌套的 <code>tool</code> 对象支持:</p><table tabindex="0"><thead><tr><th>字段</th><th>是否必填</th><th>含义</th></tr></thead><tbody><tr><td><code>provides</code></td><td>是</td><td>用于判断工具是否已经安装的可执行文件名</td></tr><tr><td><code>binary-subdir</code></td><td>否</td><td><code>install-root</code> 下存放可执行文件的目录;默认就是安装根目录</td></tr><tr><td><code>install-root</code></td><td>否</td><td>安装根目录;默认为 <code>PKG_ROOT_PATH</code>,支持路径占位符</td></tr><tr><td><code>min-version</code></td><td>否</td><td>由 <code>ToolPackage</code> 暴露的最低版本元数据installer 当前不会强制校验</td></tr></tbody></table><p><code>tool</code> 内的字段可以使用 <code>@windows</code>、<code>@unix</code>、<code>@linux</code> 和 <code>@macos</code> 后缀。例如,<code>provides@windows</code> 可以列出 <code>.exe</code> 名称,<code>provides@unix</code> 列出 Unix 名称。</p><h2 id="target-包类型" tabindex="-1">target 包类型 <a class="header-anchor" href="#target-包类型" aria-label="Permalink to “target 包类型”"></a></h2><p><code>target</code> Package 代表一个最终的构建产物,它继承于 <code>library</code>,所以包含 <code>library</code> 的所有定义字段。其配置文件位于 <code>config/pkg/target/</code>。可选的 recipe class 通常放在 <code>src/Package/Target/</code>,通过 <code>#[Target]</code> 注册,并接收 <code>TargetPackage</code>;是否继承 <code>TargetPackage</code> 是可选的。</p><p>与 <code>library</code> 的唯一区别是,<code>target</code> 包可以注册成为构建目标,且自动注册构建命令 <code>spc build:{target-name}</code>。</p><h2 id="virtual-target-包类型" tabindex="-1">virtual-target 包类型 <a class="header-anchor" href="#virtual-target-包类型" aria-label="Permalink to “virtual-target 包类型”"></a></h2><p>与 <code>target</code> 不同,<code>virtual-target</code> 可以省略 <code>artifact</code>,即不直接对应一个可构建的实体,而是用于依赖管理和构建调度的抽象构建目标。它与 <code>target</code> 使用相同的配置目录、可选 recipe class 目录和 <code>#[Target]</code> 注册方式。其余定义基本相同,但 <code>artifact</code> 字段可选且通常不设置。<code>virtual-target</code> 主要用于以下场景:</p><ul><li>定义一个抽象的构建目标,供其他包依赖,但不直接对应一个可构建的实体。</li><li>作为多个 <code>target</code> 包的公共依赖,简化依赖关系管理。</li></ul><p>典型例子是 <code>php-cli</code> 和 <code>php-fpm</code> 构建目标。它们没有独立源码,依赖 Artifact 为 <code>php-src</code> 的 <code>php</code> target构建调度会决定最终生成 CLI 还是 FPM 二进制。</p>`,39)]])}var s=r(a,[[`render`,o]]);export{i as __pageData,s as default};