代码 PIE 1.5 的无人值守安装不再自动选包:CI 里必须写 --select=ext=pkg

2026-11-05 21:02:18

PIE 1.5 的无人值守安装不再自动选包:CI 里必须写 --select=ext=pkg

PIE(The PHP Installer for Extensions)用来管理 PHP 运行时上的扩展。1.5 支持一条命令安装多个扩展,新增了 upgrade 命令,同时改变了无人值守安装时选择扩展包的方式。

如果 CI 流水线用 PIE 安装缺失的 PHP 扩展,升级到 1.5 之前先检查安装命令。以前那个允许自动选择包的参数现在不起作用,构建脚本必须为每个缺失的扩展写明用哪个包。

无人值守项目安装:旧参数已被弃用且忽略

一个使用 PhpRedis 的 Laravel 应用会在 composer.json 里声明依赖。下面是需要合并进项目现有 require 的片段:

{"require": {"ext-redis": "*"}, "require-dev": {"ext-xdebug": "*"}}

ext-redis 声明的是 PHP 运行时上的需求,它并不会安装 PhpRedis。Laravel 同时也支持纯 PHP 的 Predis 客户端,所以这条需求只应放在确实使用 PhpRedis 的应用里。

在项目目录下不带包参数运行 pie install 时,PIE 会检查项目的扩展需求。早期版本接受 --allow-non-interactive-project-install 来自动挑选包;在 1.5 中该参数已被弃用并被忽略。缺失扩展又没有指定包时,无人值守的项目安装会直接失败。

上面这个示例项目的生产构建命令:

pie install --no-interaction --no-dev --select=redis=phpredis/phpredis

映射的左边是去掉 ext- 前缀的扩展名,右边是包名。PIE 会先检查 Redis 是否已可用,需要时才安装选定的包。还有别的缺失扩展需要指定包,就再加一个 --select。

这个变化只影响基于项目的安装。像 pie install phpredis/phpredis 这样的命令本身已经指明了包。

--no-dev 只跳过 require-dev 的扩展检查

不加 --no-dev 时,PIE 也会检查项目 require-dev 里的扩展需求,上面的例子中就包含 Xdebug。生产命令排除了这条需求,同时保留了 Redis。

该参数的作用是在项目检查阶段跳过开发用扩展需求。它不会卸载 PHP 里已安装的扩展,也不能替代应用的 composer install --no-dev。

需要同时装这两个扩展的开发环境,把两个包都选上:

pie install --no-interaction --select=redis=phpredis/phpredis --select=xdebug=xdebug/xdebug

这些命令的前提是 PIE 和所需的构建依赖已经就绪。在非交互模式下,PIE 不会自动安装缺失的构建工具,除非显式要求这一行为。新增的 pie check-build-tools 命令可以在安装扩展前检查环境。

pie upgrade 尊重安装时记录的版本约束

PIE 1.5 增加了一个独立的维护命令,用于管理通过 PIE 安装的扩展:

pie upgrade

它作用于目标 PHP 安装,并遵守每个扩展在安装时记录的版本约束。它不会更新 Laravel,也不会动应用 vendor 目录里的包。

例如可以带明确的约束安装 PhpRedis:

pie install 'phpredis/phpredis:^6.0'

之后运行 pie upgrade 会安装匹配的 6.x 版本。要升到 7.x,必须改动这条约束。PIE 在升级时也会沿用 configure 选项。

其他改动

对于直接写明扩展名的镜像构建,PIE 现在支持一条安装命令装多个包:

pie install phpredis/phpredis xdebug/xdebug

新增的 pie search 命令可以在写这些命令之前先查出包名。本次发布还更新了 PIE 的 attestation 校验库。

复制全文 生成海报 PHP PIE 扩展 CI Docker

推荐文章

程序员茄子在线接单