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 。