composer self-update 不生效因仅支持小版本升级,无法跨主版本(如1.x→2.x);旧版停更、只读路径限制、插件不兼容及平台要求校验严格亦是主因。

composer self-update 为什么有时不生效
因为 composer self-update 只能跨小版本升级(比如 2.5.7 → 2.6.0),但无法从 1.x 跳到 2.x。这是官方明确限制的设计——1.x 和 2.x 是两个不兼容的主版本,self-update 不会、也不能帮你越级迁移。
- 运行
composer --version如果输出是Composer version 1.10.22或类似,说明你正卡在已停止维护的旧版里 - 某些系统(如 macOS Homebrew 安装的旧版、Docker 镜像预装版)会把
composer硬链接到一个只读路径,self-update表面成功,实际没写入新文件 - 用
which composer和ls -l $(which composer)查看真实路径和是否为符号链接,比盲信--version更可靠
覆盖安装 composer.phar 是最稳的升级方式
直接下载官方签名验证过的 composer.phar 替换本地文件,绕过所有包管理器和权限陷阱,适用于 90% 的手动安装场景。
- 执行这四行命令(注意校验 SHA384 值,防中间人篡改):
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6dc97f') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer php -r "unlink('composer-setup.php');" - 如果提示
Permission denied,别硬加sudo,改用用户级安装:php composer-setup.php --install-dir=$HOME/bin --filename=composer,再确保$HOME/bin在$PATH中 - 升级后立刻运行
composer diagnose,它会告诉你签名验证是否启用、插件是否兼容等关键状态
升级后 composer install 卡住不动?大概率是插件冲突
Composer 2.x 默认启用 plugin-api-version=2.0,而很多老插件(比如早已废弃的 hirak/prestissimo)只支持 v1,一加载就静默失败,导致命令卡在 “Package operations: 0 installs, 0 updates…” 不往下走。
- 检查项目根目录的
composer.json,删掉"config": { "plugins": ... }里所有已知不兼容的插件条目 - 全局配置也可能中招:运行
composer config -g --list | grep plugins,若发现残留,用composer config -g --unset plugin-api-version清除 - 升级后首次运行
composer update,留意控制台是否打印类似Plugin hirak/prestissimo is not compatible with Composer 2的警告——那是它在悄悄放弃加载,不是你的命令出错
别跳过 composer check-platform-reqs
Composer 2.x 在安装/更新前会严格校验 PHP 版本和扩展是否满足依赖要求,而 1.x 只是警告。如果你的项目 require 了 ext-gmp 但环境没装,2.x 会直接报错退出,不会继续往下走。
- 在 CI/CD 或部署脚本里,把
composer check-platform-reqs当作前置检查项,比等到composer install失败再排查快得多 - 这个命令会使用当前 PHP CLI 进程的真实配置(包括
php.ini加载路径),所以务必用生产环境同版本的 PHP 执行 - 如果想临时跳过平台检查(仅限调试),可用
composer install --ignore-platform-reqs,但上线前必须移除,否则可能引发运行时 fatal error
升级不是点一下就完事的事。最常被忽略的是插件清理和平台检查——它们不会报错,但会让整个流程变得不可预测。动手前先 which composer 和 composer diagnose,比什么都管用。










