Composer 2.9 默认拦截有漏洞的包版本:update 行为变化与升级清单
Composer 2.9.0 于 2025-11-13 发布。发布说明见 ,完整 changelog 在 ,版本 diff 见 。
这次升级里最需要留意的是安全相关的默认行为变化:composer update 不再无条件把你带到最新版本。
audit.block-insecure 默认开启
2.9 会自动拦截更新到有已知安全公告的包版本。该行为默认开启,防止不小心 update 到有漏洞的版本,可通过新配置项 audit.block-insecure 调整(默认 true)。
这是对已有 composer audit 命令的补充:audit 扫描 composer.lock,报告已安装包是否存在已知漏洞;audit.block-insecure 则把关卡前移到解析阶段。
相关配置:
audit.block-abandoned:拦截被废弃的包,默认false,需要显式开启。audit.ignore-abandoned:按包忽略废弃拦截。audit命令新增--ignore-unreachable,用于无法访问某些仓库的环境(比如内网 CI 拿不到全部 advisory 源)。
如果你现在靠 roave/security-advisories 来阻止安装有漏洞的版本,这个功能完全取代它,可以从依赖里移除。对 CI 维护者来说,少一个 meta 包,也少一次它的版本同步。
allow-plugins 仍是安全基线
插件授权 allow-plugins(自 2.2 引入)依然是标配:未授权的插件在 install / update 期间不会执行代码,CI 中会直接失败。另外,自 2.4.2 起,检测到以高级权限(root/sudo)运行时,Composer 会自动禁用所有插件并给出警告。
新的 repository 命令
repository 相关的增删改现在可以直接在命令行完成,不必手改 composer.json(#12388)。仓库默认存成带 name 属性的 JSON 数组,便于寻址:
composer repo list
composer repo add foo vcs https://github.com/acme/foo
composer repo add bar composer https://repo.packagist.com/bar
composer repo add qux vcs https://example.org --after bar
composer repo remove foo
composer repo set-url foo https://git.example.org/acme/foo
--after 用来控制仓库顺序,set-url 适合镜像地址迁移。
lock 文件冲突自动恢复
只有 content-hash 属性冲突时,运行 update --lock,或重新 update 某个包,Composer 会读取 lock 文件并忽略 git 冲突标记,自动恢复(#11517)。多人同时改依赖的分支合并场景,这个改动能省掉大部分手工解冲突。
update --minimal-changes
完整更新时的保守选项:只改动满足变更约束所必需的包(#12349)。对应配置 update-with-minimal-changes,以及环境变量 COMPOSER_MINIMAL_CHANGES(#12545)。在 CI 里想缩小 diff、避免顺带升级无关依赖时比较有用。
平台与传输层
- 原生支持 Forgejo / Codeberg 仓库(#12307)。
- 支持 HTTP/3(#12363),需要 libcurl 支持;否则回退。
- 自定义 header 认证(#12372)、客户端 TLS 证书(#12406)。
命令与输出的小改动
licenses新增--locked,显示 lock 文件而非已安装包的数据(#12595)。- 新增
SHELL_VERBOSITY环境变量,控制 shell 脚本的详细度(#12473)。 init支持非交互运行(#12546)。- 新增
COMPOSER_PREFER_DEV_OVER_PRERELEASE环境变量,配合--prefer-lowest使用(#12585)。 - Windows 下
self-update支持 sudo 提权(#12543)。 - 通过减少 autoloader 创建次数,提升 script handler 性能(#12456)。
修复项
- dev 版本在 source 缺失时,dist ref 的显示问题。
- 包被弃用但没有新 release 时,不再显示弃用警告(#12423)。
- PHP preloading 难以调试的问题(#12528)。
- Symfony 7 兼容问题。
2.9.0 内部变化与升级注意
代码库新增 Composer/DependencyResolver/SecurityAdvisoryPoolFilter.php 和 Advisory/AuditConfig.php;doc/06-config.md、doc/articles/authentication-for-private-packages.md 有较大更新,配置项变化建议对照文档确认。composer-plugin-api 升到 2.9.0,依赖该 API 的插件需要同步兼容版本。
升级时的取舍大致是:
- 新项目、常规业务仓库直接升。默认拦截有漏洞版本是净收益,遇到误报可以用
audit.block-insecure: false或更细的忽略配置临时放行。 - 还在用
roave/security-advisories的项目,升级后可以移除该依赖,但先跑一次完整update确认解析结果一致。 - 插件生态较重的项目,先把
composer-plugin-api相关插件升级到支持 2.9 的版本再升级 Composer 本体。 - CI 中如果依赖 advisory 数据源但网络受限,注意给
audit加--ignore-unreachable,否则可能因为拉不到公告而失败。
audit.block-abandoned 默认关闭,是否开启取决于项目对替代方案的容忍度:开启后,被废弃的包会直接挡住更新,老项目容易卡住,建议在非阻塞阶段先观察再启用。