项目级配置需进入含composer.json的根目录执行命令,修改当前项目composer.json的repositories字段,配完必须删除vendor和composer.lock后运行composer install才生效。

项目级配置必须进根目录再执行命令
项目专属镜像不是改全局设置,而是把源写进当前项目的 composer.json。不进项目根目录就运行命令,Composer 会报错或写到错误位置——比如写进你家目录下的空 composer.json,甚至创建一个无意义的临时文件。
正确做法是先 cd 到含 composer.json 的目录,再执行:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
这条命令会自动在 composer.json 顶层添加或更新 "repositories" 字段,key 固定为 "packagist",不会覆盖已有的私有源(如 GitHub private package 或企业 Nexus 源)。
- 如果
composer.json原本没有"repositories"字段,命令会新建一个对象:"repositories": {"packagist": {...}} - 如果已有
"repositories": [](数组格式),命令会失败;需先手动改成"repositories": {}再重试 - 千万别手写
"packagist.org": false—— 这会让 Composer 直接禁用基础包校验,导致php、ext-json等平台依赖无法验证
配完必须删 vendor 和 composer.lock 才生效
Composer 优先读取 composer.lock 中记录的 dist URL 和 hash,哪怕你刚配好镜像,它仍可能从 packagist.org 下载 ZIP 包——因为 lock 文件里存的是旧地址。
所以项目级换源后,必须彻底清理旧状态:
- 删掉整个
vendor/目录 - 删掉
composer.lock - 再执行
composer install(不是update)
install 会重新解析 composer.json + 当前镜像配置,生成新 lock 文件,并从镜像源下载所有包。如果跳过这步,大概率看到 “Loading composer repositories” 卡住,或者报 file could not be downloaded 错误。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
验证是否真的走项目镜像
别只看命令有没有报错。真正生效的标志是网络请求发往镜像域名,且 composer.json 结构正确。
分两步验证:
- 检查
composer.json是否出现标准结构:"repositories": {"packagist": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}} - 加
-vvv跑一次安装:composer install -vvv 2>&1 | grep -i 'mirrors\.aliyun\|tuna\.tsinghua',确认日志中出现镜像域名
注意:如果项目里已有 "repositories" 数组(比如含私有 GitLab 源),且你手动编辑时写成 "packagist": {...}(没包在对象里),Composer 会静默忽略该条目,不报错也不生效。
CI/CD 和多用户环境别依赖全局配置
GitHub Actions、GitLab Runner、宝塔面板默认不读你的 ~/.composer/config.json。它们要么以 runner 用户运行,要么用 www 用户执行 PHP CLI,而这些用户的家目录下根本没有镜像配置。
项目级配置天然规避这个问题——只要 composer.json 提交进 Git,所有环境拉下来就能用同一套源策略。
- CI 流水线里不用额外配
COMPOSER_HOME或sudo -u www - 同事
git clone后直接composer install,无需再教他配镜像 - 如果某次构建失败提示
Could not resolve host packagist.org,说明项目没配镜像,或repositories字段被误删
最易被忽略的一点:项目级配置优先级高于全局。哪怕你本地全局配了腾讯云镜像,只要项目 composer.json 里写了阿里云,install 就一定走阿里云——这个行为不可绕过,也无需额外开关。

















