项目级镜像生效必须在 composer.json 的 repositories 字段中明确声明为对象{}而非数组[],且需删除 vendor/ 和 composer.lock 后执行 composer install 重建锁文件;老项目应禁用 packagist.org 兜底而非直接配置镜像。

项目级配置必须写进 composer.json 的 repositories 字段
不是改全局配置,也不是临时加参数——项目级镜像生效的前提,是明确声明在项目自己的 composer.json 里。Composer 会优先读这个文件里的 repositories,一旦存在,就完全忽略全局配置(哪怕你本地 ~/.composer/config.json 写对了也没用)。
常见错误现象:执行了 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,但进项目目录后 composer install 依然卡在 Downloading from https://packagist.org。
-
repositories必须是对象({}),不能是空数组([]);如果原composer.json是"repositories": [],命令composer config repo.packagist composer ...会直接失败 - 正确做法:先手动编辑
composer.json,把"repositories": []改成"repositories": {},再运行配置命令 - 命令执行后,生成的键名固定为
"packagist",值是一个完整对象:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
composer config repo.packagist 命令实际做了什么
这条命令不是“追加”,而是“合并写入”——它只操作 repositories 对象下的 packagist 子键,不碰其他已有源(比如 Git 私有包、Satis 源)。前提是 repositories 是对象格式,否则会覆盖整个字段。
如果你已有私有 VCS 源,例如:
"repositories": {
"my-private": {
"type": "vcs",
"url": "git@xxx.com:team/pkg.git"
}
}
再执行 composer config repo.packagist composer https://mirrors.aliyun.com/composer/,结果就是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"repositories": {
"my-private": { ... },
"packagist": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
}
- 不会删掉
my-private,也不会重排顺序 - 但若原
repositories是数组([]),该命令会报错并中断,必须手动处理 - 别指望它自动补
"type": "composer"或修正 URL 尾部斜杠——它只按你传的参数原样写入
改完配置后为什么 composer install 还不走镜像
因为 composer.lock 文件里存的是旧源的 dist URL 和 hash,它不关心你新配了什么镜像。只要 lock 文件存在,Composer 就照着它下载,根本不会查新配置。
典型表现:日志里出现 Downloading https://api.github.com/repos/symfony/console/zipball/... 或 GET https://packagist.org/p/symfony/console/...,说明还在走旧路径。
- 必须删掉
vendor/和composer.lock两个文件/目录 - 然后只运行
composer install(不是update),让 Composer 从头解析依赖、生成适配新镜像的 lock 文件 - 验证是否真走镜像:加
-vvv参数,看日志里是否出现GET https://mirrors.aliyun.com/composer/p/...
老项目配镜像要特别小心 packagist.org 隐式兜底
Composer 2.2+ 默认启用 packagist.org 隐式兜底,但老项目(尤其是 PHP 7.4 及以下、锁文件含 32 位 md5 content-hash 的)很可能依赖已下线或未同步的旧包版本(如 symfony/console v3.4)。阿里云/腾讯云镜像通常只保留最近两年活跃包。
此时强行配镜像,composer install 可能报 Could not find package symfony/console,不是镜像地址错了,是镜像压根没存那个版本。
- 安全做法:老项目不要开
packagist镜像,改用禁用兜底:composer config repositories.packagist.org false - 这会在
composer.json里写入"repositories": {"packagist.org": false},强制 Composer 完全信任 lock 文件记录的原始 dist URL - 新项目才用
repo.packagist配置,且确保composer.lock是全新生成的

















