必须重装composer才能升级到v2,因self-update命令自2.5.0起已被彻底移除;需先用which composer和ls -l确认安装路径与链接状态,再通过官方安装脚本重装并校验sha-384与gpg签名。

必须重装,不能用 composer self-update 升级到 v2 —— 这个命令在 Composer 2.5.0 起已被彻底移除,执行会直接报错 Command "self-update" is not defined。
怎么确认你还在用 Composer 1.x?
别只信 composer --version,它可能被缓存或指向旧文件:
- 先运行
which composer看路径,比如/usr/local/bin/composer或/opt/homebrew/bin/composer - 再运行
ls -l $(which composer),如果输出里有->,说明是符号链接 - 如果是链接,用
readlink -f $(which composer)找到真实文件位置 - 若路径在
/usr/bin或/usr/lib/php这类系统保护目录,且你没写权限,就别硬sudo覆盖
常见误判点:macOS 上 Homebrew 安装的老版本,which composer 指向 /opt/homebrew/bin/composer,但实际执行的是硬链接到某个已废弃的 composer.phar;Linux 上软链到 /usr/local/bin/composer.phar,版本信息其实是那个文件的内容。
为什么必须用官方脚本重装,而不是手动下载替换?
因为 Composer 2 的安装脚本内置 SHA-384 校验和 GPG 验证,绕过它等于放弃安全校验:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
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 的依赖解析器完全重写,composer.lock 格式已变:
- 新增
content-hash字段、"lock-version": 2、支持多平台哈希 - 直接复用旧
composer.lock会报错:Your lock file does not contain a compatible set of packages - 必须删除整个
vendor/目录(不要只删子目录)和composer.lock(保留composer.json) - 再运行
composer install生成全新 lock 文件;若失败,可先试composer install --ignore-platform-reqs排查 PHP 版本或扩展问题
最易被忽略的一点:CI 环境(如 GitHub Actions)中,composer.lock 往往被缓存,升级后若未清缓存或未更新 workflow 中的 PHP 版本,会持续失败。不是脚本问题,是环境没对齐。










