团队Composer镜像配置必须写入composer.json并提交Git,因全局配置不被Git跟踪且被项目级repositories覆盖;切换镜像前须删除vendor/和composer.lock,否则dist.url仍指向旧源导致未走镜像。

团队共享的 Composer 镜像配置,不能靠“谁配了谁快”,必须让所有人、所有环境(本地开发机、CI/CD、Docker 容器、Web 服务用户如 www-data)都走同一源,且不破坏私有包解析——这只有项目级 composer.json 显式声明 + 强制重建锁文件才能做到。
为什么 composer config -g 不是团队方案
它只写进当前用户的 ~/.composer/config.json,而 Git 不跟踪它,CI 流水线(如 GitHub Actions runner)启动的是干净容器,根本读不到;更关键的是:只要项目 composer.json 里有 repositories 字段,全局配置就完全被忽略。
-
composer config -g repo.packagist在宝塔、Docker 或 Jenkins 中执行后,对其他成员或构建节点无效 - 某人误执行
composer config -g repo.packagist composer https://packagist.org,全队本地瞬间退回到公网源 - 私有源(如
"type": "vcs")若只在个人全局配置里添加,别人composer install时直接报Could not find package
composer.json 的 repositories 数组怎么写才安全
必须把镜像源写进 composer.json 并提交 Git,这是唯一能被所有环境一致读取的方式。但结构错一点就失效:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
repositories必须是数组([]),不是对象({});写成对象会被 Composer 完全忽略 - 第一项必须是
{"packagist.org": false}—— 这是切断 Composer 2.2+ 硬编码兜底逻辑的唯一方式 - 第二项起才是镜像源,例如:
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} -
url值末尾必须带/,否则拼出的路径如/composer/packages.json会 404,触发静默 fallback
改完 composer.json 后,为什么还要删 vendor 和 composer.lock
composer.lock 里存的是每个包的完整 dist.url(比如 https://api.github.com/.../zipball/),它是旧配置下生成的。Composer 安装时优先读 lock 文件,完全不重新解析 repositories —— 即使你刚加了镜像,它仍按 lock 里写的地址去下载。
- 必须执行:
rm -rf vendor composer.lock,再运行composer install(不是update) -
composer update会复用旧 lock 中的元数据,无法触发新镜像的元数据拉取 - CI 脚本里要显式加这一步,否则缓存会复用旧 lock,构建结果不可控
如何防止全局镜像污染项目行为
只要项目 composer.json 中定义了 repositories 数组,Composer 就会彻底忽略全局的 repo.packagist 配置。但问题在于:有人可能在全局配了镜像,又在项目里写了另一个镜像,结果部分命令(如 composer require)因上下文不同读取逻辑不一致,引发混用。
- 建议团队统一执行:
composer config --global --unset repo.packagist - 验证是否清空:
composer config --global repo.packagist输出应为空或https://packagist.org - CI 脚本开头加一句
composer config --global --unset repo.packagist,防止单独配置残留
最常被跳过的动作是删 composer.lock —— 很多人以为改完 composer.json 就立刻生效,结果 composer install 依然卡在 GitHub 下载,因为 lock 文件里的 dist.url 根本没更新。

















