编程 PIE 1.5:一次装多个 PHP 扩展,--select 取代自动推断,upgrade 不跨大版本

2026-10-26 20:03:41

PIE 1.5 发布:一次装多个扩展、--select 取代自动推断、升级按原约束走

PIE(PHP Installer for Extensions)1.5 系列发布,这一版从开始动手到发布大约五个月。内部实现做了较大改动,几个此前一直搁置的功能因此落地。本文按发布说明的顺序梳理各条目,命令与语义保持原样。

  • 项目仓库:https://github.com/php/pie
  • 发布说明原文:https://thephp.foundation/blog/2026/10/07/pie-1-5-released/
  • Attestation 库:https://github.com/ThePHPF/attestation(BSD-3-Clause)

一次安装多个扩展

pie install 现在接受多个包参数,一条命令装完:

$ pie install php-amqp/php-amqp:^2.2 girgias/csv

这对构建 Docker 镜像比较实用——原来要拆成多条 pie install,或者在脚本里循环。配置选项仍然可以传,PIE 会把它们分别过滤出来,归到对应扩展的 ./configure 参数里,不会张冠李戴。

用 --select=... 做无人值守安装

在 PHP 项目里跑 pie install 时,PIE 需要知道项目缺的扩展该由哪个包提供。旧版本提供了 --allow-non-interactive-project-install,自动为缺失的扩展挑包。问题在于这种方式有风险:没有任何机制保证某个缺失扩展最终会被解析到哪一个包,装上的东西可能不是你以为的那个。

1.5 移除了这条自动路径,改为必须显式选择:

$ pie install \
  --select=example_pie_extension=asgrim/example-pie-extension \
  --select=redis=phpredis/phpredis

语法是 --select=<扩展名>=<包名>,一个扩展对应一个 --select。对 CI、Docker 构建这类没有人盯着终端的场景,包来源由此变成写死在命令行里的确定值,而不是靠解析结果碰运气。

实操上有两点值得注意:多扩展安装与 --select 可以组合使用,构建脚本里一次把扩展和包名都固定下来;版本约束仍建议按 vendor/package:^x.y 的写法显式给出,而不是依赖隐式解析到的最新版。

pie upgrade 批量升级

$ pie upgrade

一条命令升级所有由 PIE 管理的扩展,但只在每个扩展最初安装时的版本约束范围内进行。发布说明给的例子很清楚:

  • 用 PIE 安装 foo/bar:^1.1,当时装到最新版 1.1.5
  • 之后 foo/bar 发布 1.2.0
  • 执行 pie upgrade,foo/bar 升到 1.2.0,因为 1.2.0 落在 ^1.1 约束内
  • 再之后 foo/bar 发布 2.0.0
  • 再次执行 pie upgrade,foo/bar 不会被升级,因为 2.0.0 超出了 ^1.1 的范围

也就是说 upgrade 不会替你跨大版本,跨大版本仍需要重新 pie install 并显式改约束。

Attestation 库的大幅更新

PIE 一直用 Sigstore 框架验证自身产物的真实性。此前的做法是:如果有 gh CLI 就直接调用它,没有则退化到一套基础的 Sigstore 验证实现。这一版把 Sigstore 一致性测试套件的大部分实现了出来,结果是 131 passed、5 skipped(该库只做验证,不涉及签名路径)、4 expected failures。按发布说明的说法,这是目前 PHP 侧覆盖较完整的 Sigstore 验证实现,PIE 在执行更新时可以走这套更完整的校验。

另一个变化是解耦:库不再强绑 GitHub 的 attestations 与 trusted root certificate。这两者仍然默认内置,开箱即用,但已不是硬性依赖。库以 BSD-3-Clause 许可开源,地址 https://github.com/ThePHPF/attestation 。

其他新特性

  • pie install 在 PHP 项目中支持 --no-dev,跳过 dev 扩展。
  • 支持 --suppress-download-url-method,即使扩展本身声明了某些下载 URL 方式,也可以把它们排除掉。
  • 新增 pie search ...,用来查找提供某个扩展的包。
  • pie check-build-tools 可以提前检查构建所需的前置工具是否就位,属于乐观检查:先查一遍,避免构建到一半才失败。
  • 对部分依赖占位符(placeholder)的 PECL 扩展提供了支持。

反馈渠道

PIE 仍在持续开发。想法和讨论走仓库的 GitHub Discussions,发现 bug 提到 GitHub Issues,入口都在 https://github.com/php/pie 。

复制全文 生成海报 PHP 扩展 工具链 Composer

推荐文章

程序员茄子在线接单