如何安全地从Composer 1.x迁移到2.x版本? (迁移指南)

11次阅读

composer 2.x 需 php ≥ 7.2.5(推荐 ≥ 7.4)、启用 openssl 扩展,禁用 http 包源,废弃部分命令与插件(如 hirak/prestissimo),升级可能导致 install 失败、插件崩溃或 CI 中断。

如何安全地从Composer 1.x迁移到2.x版本? (迁移指南)

Composer 2.x 不是简单替换二进制文件就能用的——它默认启用更严格的依赖解析、禁用不安全的 HTTP 包源、并废弃了多个命令和配置项。直接升级可能触发 composer install 失败、插件崩溃或 CI 构建中断。

检查当前环境是否满足 Composer 2.x 要求

Composer 2.x 要求 PHP ≥ 7.2.5(推荐 ≥ 7.4),且部分旧插件(如 hirak/prestissimo)在 2.x 中已彻底失效。运行以下命令确认基础兼容性:

php -v composer --version php -m | grep openssl

关键点:

  • openssl 扩展必须启用,否则 https 包源会失败(Composer 2.x 默认禁用 HTTP 源)
  • 若项目使用 phpunit/phpunit symfony/console
  • CI 环境中若硬编码composer self-update --1,必须改为 --2 或移除(避免降级)

迁移前必须清理的配置与命令

Composer 2.x 移除了 config.lock、废弃了 require-dev 的宽松写法,并将 composer global 命令行为收紧。常见断裂点:

  • 删除项目根目录下的 composer.lock 文件(强制重新生成兼容格式)
  • 检查 composer.json 中是否存在 "minimum-stability": "dev" + "prefer-stable": false 组合——这在 2.x 中可能导致意外解析到不稳定版本,建议显式设为 "prefer-stable": true
  • 替换所有 composer install --no-scriptscomposer install --no-autoloader --no-scripts(2.x 默认仍生成 autoloader,除非明确禁用)
  • 移除 hirak/prestissimo 插件:执行 composer global remove hirak/prestissimo,它与 2.x 不兼容且已无必要(内置并行下载)

升级后验证依赖解析是否可信

Composer 2.x 使用全新 SAT 求解器,默认启用 lock 文件完整性校验。升级后首次 composer install 可能报错:

  • Your lock file does not contain a compatible set of packages:说明旧 composer.lock 与新解析逻辑冲突,删掉重来即可
  • Package X has a dependency on Y which is not allowed by your minimum-stability:不是 bug,是 2.x 更早、更严格地拦截了隐式不稳定依赖
  • 若使用私有仓库,确保其 composer.json 中的 repositories 条目协议为 https,HTTP 地址会被静默跳过
  • 运行 composer validate 检查 composer.json 格式;加 --strict 可捕获已被弃用的字段(如 archive 配置)

CI/CD 和团队协作中的隐藏风险

很多团队在 CI 中用 curl -sS https://getcomposer.org/installer | php 下载最新版,这会导致不同环境 Composer 版本不一致。必须锁定版本:

  • CI 脚本中改用:curl -sS https://getcomposer.org/installer | php -- --version=2.5.8(填入稳定小版本号)
  • 团队开发机应统一通过 composer self-update --2 升级,而非 self-update(后者可能回退到 1.x)
  • 若项目使用 composer-bin-plugin,确认其版本 ≥ 1.5.0,旧版无法识别 Composer 2.x 的 PluginInterface 变更
  • composer dump-autoload -o 在 2.x 中默认启用 classmap 优化,但若项目含大量动态加载类(如 laravelclassmap 未覆盖的 helpers.php),需手动加 --optimize-autoloader 显式启用

最易被忽略的是私有 Packagist 镜像——如果镜像服务未升级到支持 Composer 2.x 协议(如 v2 API endpoint),composer update 会卡在 metadata 获取阶段,而不是报错。需要运维确认镜像后端已更新。

text=ZqhQzanResources