大型团队必须用项目级repositories数组配置且首项为{"packagist.org": false},否则CI构建、多环境部署、私有源共存全部失控;因composer config -g仅写入当前用户配置,CI runner等非交互环境无法读取,且全局配置无法Git跟踪导致不一致。

大型团队必须用项目级 repositories 数组配置,且首项为 {"packagist.org": false},否则 CI 构建、多环境部署、私有源共存全部不可控。
为什么 composer config -g 在大型团队里根本不能用
它只写入当前用户的 ~/.composer/config.json,而 CI runner、宝塔的 www-data、K8s 中的非 root 容器用户都读不到。你本地 composer install 成功,流水线照样卡在 Loading composer repositories。
更隐蔽的问题是:不同成员执行 composer config -g 时用的镜像 URL 可能不一致(阿里云/腾讯云/华为云混用),导致 composer.lock 中记录的 dist hash 来源混乱,引发构建结果不一致甚至线上包校验失败。
- CI 脚本里加
sudo -u www composer config -g ...是权宜之计,无法解决跨环境一致性 - 全局配置无法被 Git 跟踪,新人拉代码后行为不一致
- 一旦某人误配了
repo.packagist,整个团队的composer require行为可能因上下文切换而混用源
repositories 必须是数组,且第一项必须是 {"packagist.org": false}
Composer 2.2+ 把 packagist.org 当作硬编码兜底源,光写镜像 URL 不会禁用它。只有显式声明 {"packagist.org": false} 作为独立数组项,才能切断回退路径。
常见错误写法:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"repositories": {"packagist.org": false, "type": "composer", "url": "..."}—— 合并在一个对象里,无效 -
"repositories": [{"type": "composer", "url": "..."}]—— 缺少packagist.org禁用项,仍会 fallback -
"repositories": {}—— 对象格式,Composer 完全忽略
正确结构(手动编辑 composer.json):
"repositories": [
{"packagist.org": false},
{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},
{"type": "vcs", "url": "https://git.example.com/private-lib.git"}
]
换镜像后必须删 vendor 和 composer.lock 才生效
composer.lock 里存的是每个包的完整 dist URL 和 hash,比如 "dist": {"url": "https://api.github.com/.../zipball/..."}。哪怕你刚改完 repositories,Composer 安装时仍优先读 lock 文件,完全不重新解析源配置。
- 执行
composer update没用——它复用旧 lock 的元数据,不会触发新镜像的 packages.json 拉取 - 必须运行
rm -rf vendor composer.lock && composer install - CI 脚本中要显式加这一步,否则缓存会复用旧 lock,构建结果不可控
- 团队应把
composer.lock提交进 Git,并在 PR 模板中注明“换镜像后需重生成 lock”
私有源与镜像共存的关键细节
项目同时用 Git 私有包和中文镜像时,顺序不影响解析,但结构必须合规:
- 所有源(镜像、VCS、artifact)都放在同一
repositories数组中,不要拆分 - 华为云镜像地址含
/repository/php/composer/,漏掉/php/就 404;腾讯云地址末尾多一个/会触发 cURL error 60 - 不要在
composer.json根节点写"packagist.org": false—— 这会导致 PHP 扩展校验失败 - 验证是否真走镜像:运行
composer install -vvv 2>&1 | grep "Reading packages.json",看路径是否含mirrors.aliyun.com或对应镜像域名
最易被忽略的一点:团队必须统一执行 composer config --global --unset repo.packagist 清空所有成员的全局残留配置,否则局部命令(如 composer require)可能因上下文差异意外读取到冲突源。

















