Git仓库迁移后Composer镜像源不会自动更新,必须手动或脚本化重配;实际生效配置优先级为:项目级repositories > 全局repo.packagist > 默认官方源;项目级配置会完全屏蔽全局设置,需逐项检查并批量替换composer.json中的旧URL,清缓存后用composer install -vvv --no-cache验证请求域名。

Git 仓库迁移后,Composer 镜像源不会自动更新,必须手动重配或脚本化处理;否则 composer install 仍会尝试访问旧域名(如 https://old-repo.example.com),导致超时、403 或 404 错误。
确认哪些配置项实际在用
Composer 的镜像源控制分散在三处,优先级从高到低:项目级 composer.json 中的 repositories → 全局配置 repo.packagist → 默认官方源。迁移后最容易被忽略的是项目级配置——它会完全屏蔽全局设置。
- 检查项目是否自定义了私有源:
composer config repositories.0.url(若输出非空,说明已硬编码) - 查看全局镜像是否生效:
composer config -g repo.packagist,输出必须是完整 JSON 对象,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},不是null或空字符串 - 若项目
composer.json中存在"repositories"字段且含"url",该 URL 就是实际生效源,改全局没用
批量替换项目内所有 composer.json 的旧 URL
当多个子包、monorepo 或历史分支共存时,靠人工逐个修改不现实。直接用 shell + sed 批量处理最稳,注意路径和转义:
- Linux/macOS(推荐):
find . -name "composer.json" -exec sed -i 's|https://old-repo\.example\.com|https://new-repo.example.com|g' {} \; - macOS 上
sed -i要求后缀参数:sed -i '' 's|...|...|g' {} - Windows 用户建议用 Git Bash 或 WSL,原生 CMD 不支持
find递归 +sed组合 - 执行前先 dry-run:
grep -r "old-repo\.example\.com" --include="composer.json" .确认范围
清缓存并验证新源是否真正生效
即使 URL 替换完成,Composer 仍可能从缓存读取旧的 packages.json 和 provider 列表,导致请求发向旧地址。
- 必须运行:
composer clear-cache(不是composer cache-clear,后者已废弃) - 验证缓存是否清空:
ls ~/.composer/cache/repo/ | grep old-repo,应无输出 - 临时绕过缓存测试:
composer install -vvv --no-cache 2>&1 | grep "Downloading",观察日志中实际请求的域名 - 若仍见旧域名,说明某处
repositories配置未覆盖全,重点查vendor/下第三方包的composer.json(它们不影响你项目,但可能干扰调试)
CI/CD 流程中避免重复踩坑
自动化部署脚本里常漏掉两件事:一是没在构建前重置 Composer 配置,二是没校验镜像源是否真实切换成功。
- 在 CI 脚本开头加:
composer config -g repo.packagist '{"type":"composer","url":"https://new-repo.example.com/"}'(末尾/不可省) - 加校验步骤:
test "$(composer config -g repo.packagist | grep -o 'https://new-repo\.example\.com/')" = "https://new-repo.example.com/" || exit 1 - 不要依赖
composer install --prefer-dist自动 fallback——它不会报错,只会悄悄回退到官方源,且无提示 - monorepo 场景下,根目录
composer.json的repositories会继承给所有子包,但子包自己的composer.json若显式声明了repositories,仍会优先使用自己的
真正麻烦的不是替换 URL,而是某些私有包的 composer.json 里把 dist.url 写死了旧地址,这种得进 vendor/ 手动改或让包维护者发新版——Composer 本身不提供自动重写 dist 源的能力。


















