维护一个老 ThinkPHP 5.1 项目,composer install 直接崩:
Problem 1
- topthink/think-installer is locked to version v2.0.0 and an update of this
package was not requested.
- topthink/think-installer v2.0.0 requires composer-plugin-api ^1.0
-> found composer-plugin-api[2.9.0] but it does not match the constraint.
Problem 2
- topthink/framework v5.1.39 requires topthink/think-installer 2.*
...
顺带还有:
The "https://packagist.phpcomposer.com/packages.json" file could not be downloaded (404)
两个问题:Composer 版本不兼容 + 镜像源死了。
症状 1:think-installer 只支持 Composer 1
topthink/think-installer v2.0.0 明确要 composer-plugin-api ^1.0,也就是 Composer 1.x 的插件接口。你机器上是 Composer 2.x,插件接口版本变成 2.x,直接不兼容。
TP5.1 上线那会儿(2018)Composer 2 还没出,这问题在当时不存在,遗留下来才成了坑。
解法:降回 Composer 1
推荐、最省事、也最不折腾业务代码。
方法 A:Composer 自己降版本
composer self-update --1
Composer 会在原地切到最新的 1.x(一般是 1.10.27)。想指定:
composer self-update 1.10.27
方法 B:装一个独立的 Composer 1
不想动全局 Composer 的话,单独下一份:
curl -sS https://getcomposer.org/installer | php -- --1
mv composer.phar /usr/local/bin/composer1
composer1 install
老项目用 composer1,新项目继续用 composer。
症状 2:packagist.phpcomposer.com 已凉
老教程里推荐的 packagist.phpcomposer.com 这个镜像已经关服多年,仍然响应 404。检查 composer.json:
cat composer.json | grep -A 3 repositories
看到:
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
改成官方源或者阿里镜像:
# 官方
composer config -g repo.packagist composer https://repo.packagist.org
# 阿里云
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# 清华(有时更快)
composer config -g repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/
-g 是全局,改单个项目就去掉。
也可以直接改 composer.json 里的 repositories 字段,同样效果。
完整恢复流程
# 1. Composer 降 1
composer self-update --1
# 2. 换镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# 3. 清缓存
composer clear-cache
# 4. 重装依赖
rm -rf vendor composer.lock
composer install
90% 的老 TP5.1 项目这一套下来就恢复了。
什么时候该升级项目
如果这不是紧急救火,考虑:
- 升到 ThinkPHP 6 或 8,从 5.1 迁移文档官方有
- 或者只把
topthink/think-installer换成topthink/framework的现代版本,去掉这个已废弃的插件
但生产环境急救时先别动这些——先降 Composer 让站起来,稳定了再排期改造。
一句话总结
think-installer 只兼容 Composer 1,最直接的解法是 composer self-update --1。顺手把死了的 phpcomposer.com 镜像换成阿里或官方源。
