ThinkPHP 5.1 老项目 + Composer 2:think-installer 装不上

维护一个老 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 68,从 5.1 迁移文档官方有
  • 或者只把 topthink/think-installer 换成 topthink/framework 的现代版本,去掉这个已废弃的插件

但生产环境急救时先别动这些——先降 Composer 让站起来,稳定了再排期改造。

一句话总结

think-installer 只兼容 Composer 1,最直接的解法是 composer self-update --1。顺手把死了的 phpcomposer.com 镜像换成阿里或官方源。