项目级配置是唯一跨环境可靠的方案,因composer config -g仅写入当前用户~/.composer/config.json,而CI/CD、Docker、宝塔等均以不同用户运行,无法读取该配置;必须用composer config repo.packagist composer https://mirrors.aliyun.com/composer/写入composer.json,并删除vendor和composer.lock后执行install。

敏捷开发中换 Composer 镜像源,不能只配一次就指望全局生效——项目级配置才是唯一能跨环境、跨用户、进 Git 的可靠方案。
为什么 composer config -g repo.packagist 在 CI/CD 里必然失效
CI 流水线(GitHub Actions、GitLab Runner)、Docker 容器、宝塔后台默认以非你本人的用户运行(如 runner、www-data、nginx),它们根本读不到你的 ~/.composer/config.json。命令看似执行成功,日志里却持续出现 Downloading https://packagist.org/packages.json。
- 别在 CI 脚本里写
composer config -g ...—— runner 用户家目录通常为空或不可写 - 宝塔部署前若用
root配了镜像,PHP-FPM 实际仍走www用户,必须显式切用户:sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - Docker 构建时,
composer install运行在干净容器内,全局配置不存在,必须靠项目级配置兜底
项目级配置必须用命令写入,不能手改 composer.json
手动编辑 composer.json 添加 "repositories" 字段,极易引发合并冲突、格式错误、私有源丢失。Composer 会把项目级和包自带的源声明合并,导致同时向阿里云、腾讯云、私有 Nexus 发请求,反而更慢。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确做法:进项目根目录后执行
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不带-g) - 该命令自动确保
"repositories"是顶层对象(不是数组),且 key 严格为"packagist",不会破坏已有私有源 - 如果项目已有
"repositories": [],先手动改成"repositories": {}再执行,否则命令报错中断 - 配置写入后会被 Git 跟踪,协作者
git pull后无需任何额外操作
composer install 前必须删掉 vendor 和 composer.lock
镜像切换不改变 composer.lock 文件内容,它里面存着旧源的 dist URL 和 hash。直接 composer install 会照着 lock 文件去 packagist.org 下载,失败后才 fallback,根本没走镜像。
- 删掉
vendor/和composer.lock是硬性前提,不是可选步骤 - 别用
composer update替代——它会沿用 lock 中的元数据,照样解析旧地址 - 验证是否真走镜像:看
composer install -vvv输出中是否有GET https://mirrors.aliyun.com/composer/packages.json - 如果看到双斜杠路径如
/composer//p2/,说明 URL 少了末尾/,配置无效
CI 流水线里要加三步保底操作
即使项目级配置已提交,CI 环境仍可能因缓存残留、锁文件陈旧、DNS 污染等问题回退到官方源。
- 每次构建开头加
composer clear-cache,清掉旧元数据缓存 - 确保
composer.lock提交到了 Git;若未提交,CI 会退化为update行为,触发全量解析 - 在
composer install后加--no-dev --prefer-dist -o,跳过 dev 包、强制 ZIP 下载、生成优化 autoload 映射 - 如遇
Could not fetch https://mirrors.xxx//p2/,立刻检查 URL 是否漏了末尾/,这是最常被忽略的拼写错误
镜像只管下载快不快,不管依赖解得对不对——如果 composer update 卡在 Resolving dependencies,问题一定出在 composer.json 的版本约束或 PHP 版本声明上,跟镜像无关。

















