Composer 2.5.0+ 已彻底移除 self-update 命令,必须通过官方安装脚本重装更新;需先用 which composer 和 ls -l 确认路径与符号链接,再执行 curl 安装脚本覆盖,并运行 hash -r 刷新 shell 缓存,最后删除 vendor/ 和 composer.lock 以适配 v2 新锁格式。

composer self-update 命令在 Composer 2.5.0 起已被彻底移除,不能靠它从 v1 升级到 v2。必须重装,否则会卡在 Command "self-update" is not defined 报错。
怎么确认你还在用 Composer 1.x?
别只信 composer --version,它可能被 shell 缓存或指向旧文件:
- 运行
which composer,看路径是/usr/local/bin/composer、/opt/homebrew/bin/composer还是$HOME/.local/bin/composer - 再执行
ls -l $(which composer):如果输出含->,说明是符号链接;用readlink -f $(which composer)才能看到真实文件位置 - 若路径落在
/usr/bin或/usr/lib/php这类系统保护目录,且你没写权限,硬sudo覆盖大概率失败
为什么必须用官方脚本重装,而不是手动替换?
因为 Composer 2 的安装脚本内置 SHA-384 校验和 GPG 签名验证,跳过它等于放弃安全校验:
- 推荐命令(复制整行执行):
curl -sS https://getcomposer.org/installer | php -- --filename=composer --install-dir=/usr/local/bin/ -
--install-dir必须和which composer输出的路径一致;不确定就先用$HOME/bin,再确保该目录在$PATH前置(如export PATH="$HOME/bin:$PATH") - 别手动下载
composer.phar然后sudo mv替换——这绕过了签名验证 - 重装完立刻运行
hash -r(bash/zsh)或重启终端,否则 shell 还缓存着旧路径,composer --version仍显示 1.x
升级后 composer install 卡在 “0 installs, 0 updates” 怎么办?
这不是网络卡死,是插件不兼容导致的静默失败:
- Composer 2 默认启用 plugin API v2,老插件(如已废弃的
hirak/prestissimo)加载即被跳过,后续逻辑中断 - 检查项目根目录
composer.json中"config": { "plugins": ... },删掉所有已知不兼容插件 - 运行
composer diagnose,它会明确告诉你哪些插件被禁用、签名是否启用、是否启用了沙箱 - 仍卡住?加
-vvv查日志:composer install -vvv,重点关注Loading plugin和Executing command行
升级后必须清理 vendor 和 composer.lock
Composer 2.x 的依赖解析器完全重写,composer.lock 格式已变(新增 content-hash、"lock-version": 2 字段),直接复用旧文件会报错:Your lock file does not contain a compatible set of packages:
- 删除整个
vendor/目录(不要只删部分子目录) - 删除
composer.lock(保留composer.json) - 再运行
composer install生成全新 lock 文件 - 跳过这步会导致部分包被降级、
platform配置失效,甚至误判 PHP 版本不兼容
最常被忽略的是:重装后不运行 hash -r 或不删旧 composer.lock,结果以为升级成功,实际还在跑 v1 的逻辑。这两步漏掉,90% 的“升级失败”问题就已注定。











