项目级配置必须写进composer.json以实现环境隔离,因全局镜像配置对所有项目生效;正确做法是通过repositories字段声明镜像并设"packagist.org": false禁用默认源,或用composer_repo_packagist环境变量临时切换,且需配合更新composer.lock确保元数据同步。

项目级配置必须写进 composer.json,否则环境间无法隔离
全局镜像(composer config -g repo.packagist)对所有项目生效,根本做不到“测试用阿里云、生产用腾讯云”。真正可控的方式,是让每个环境的构建过程自己决定用哪个源——这只能靠 composer.json 里的 repositories 字段,或运行时临时注入。
关键点:
- CI/CD 流水线里不能依赖开发机上的全局配置,因为 Jenkins 或 GitLab Runner 往往以独立用户(如
gitlab-runner)运行,~/.composer/config.json是空的或错的 -
composer.json提交到 Git 后,所有协作者和构建节点拿到的是同一份声明,行为一致 - 如果项目已有私有仓库(比如内部 Satis),
repositories必须是对象结构(不是数组),否则composer config repo.packagist命令会失败
用 COMPOSER_REPO_PACKAGIST 环境变量临时切源,适合 CI 分支灰度
想在测试环境走 https://mirrors.aliyun.com/composer/,生产环境走 https://mirrors.cloud.tencent.com/composer/,又不想维护两套 composer.json?用环境变量最轻量。
它优先级高于 composer.json 里的 repositories,且只影响当次命令:
- 测试环境执行:
COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/ composer install --no-dev - 生产环境执行:
COMPOSER_REPO_PACKAGIST=https://mirrors.cloud.tencent.com/composer/ composer install --no-dev - 该变量仅覆盖 packagist.org 的源,不影响其他自定义仓库(如私有包)
- 注意:URL 必须 HTTPS 且末尾带
/,少一个字符就静默回退到官方源
项目 composer.json 里禁用默认源,避免 fallback 到 packagist.org
只写一个镜像 URL 不够。Composer 默认会把 packagist.org 当作兜底源,哪怕你配了国内镜像,一旦镜像响应慢或返回 404,它仍会去官方源重试——而这一步常卡满 30 秒。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
正确写法(必须显式关掉默认源):
{
"repositories": {
"packagist": {
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
},
"packagist.org": false
}
重点:
-
"packagist.org": false这行不能省,否则你的镜像只是“额外源”,不是“唯一源” - 如果
repositories是数组(比如同时配了私有源 + 镜像),必须把packagist放第一个,且整个结构要加"packagist.org": false - 验证方式:
composer show monolog/monolog --no-cache,输出里Available from行必须只出现你指定的镜像域名
Docker 构建中别碰全局配置,用 COMPOSER_HOME 隔离缓存
在 Dockerfile 里执行 composer config -g 是危险操作:多个构建并发时,~/.composer/config.json 可能被不同 job 覆盖,导致某次构建意外走错镜像。
安全做法是彻底隔离:
- 构建前设临时路径:
COMPOSER_HOME=/tmp/composer-home-$$($$是当前进程 PID) - 加上
--no-cache和-vvv确保日志里能看到真实请求地址 - 完整命令示例:
RUN COMPOSER_HOME=/tmp/composer-home-$$ COMPOSER_REPO_PACKAGIST=https://mirrors.ustc.edu.cn/composer/ composer install --no-dev --prefer-dist -vvv - 构建完删掉
/tmp/composer-home-$$,不残留任何配置
真正容易被忽略的,是 composer.lock 文件本身记录了元数据来源。哪怕你换镜像,只要 lock 文件没更新,Composer 仍会按旧地址拉包——所以多环境切换时,composer update 或删 lock 后重装,比改配置更关键。










