必须用repositories数组,首项{"packagist.org": false}禁用官方源,第二项{"type":"composer","url":"https://mirrors.aliyun.com/composer/"}配国内镜像,第三项{"type":"vcs","url":"https://git.example.com/repo.git"}加私有Git仓库,URL均需以/结尾,改后删vendor和composer.lock再执行composer install。

怎么在 composer.json 里同时写国内镜像和私有 Git 仓库
必须用 repositories 数组,不能只写一个对象;顺序决定优先级,国内镜像要放第一位,否则私有包可能被官方源拦截或解析失败。
-
"repositories"字段必须是数组([]),不是对象({})——否则 Composer 2.x 会报错或静默忽略部分配置 - 第一项必须是禁用官方源 + 指向国内镜像,格式严格为:
{"packagist.org": false}和{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 后续再追加
vcs类型的 Git 仓库,例如:{"type": "vcs", "url": "https://git.example.com/php/my-package.git"} - 所有 URL 必须以
/结尾,https://开头,否则请求路径拼接错误,返回 404
为什么 composer config 命令无法安全追加 Git 仓库到已有镜像配置
因为 composer config repo.packagist ... 只能操作 repositories.packagist 这个键,它会把整个 repositories 覆盖成对象格式({}),而 Git 仓库需要数组格式才能并存;一旦覆盖,原有私有源就丢了。
- 如果当前
composer.json的repositories是数组(比如已有镜像+私有源),运行composer config repo.packagist ...会直接报错:Invalid argument: repositories must be an object - 如果
repositories是空对象({}),命令会把它转成{"packagist": {...}},但这种结构不支持再加vcs项 - 正确做法:手动编辑
composer.json,确保repositories是数组,并按顺序排列
type 填错会导致静默失败,怎么确认生效了
填 vcs 却配了 Satis 服务地址,或填 composer 却给了 Git URL,Composer 不会报错,但 composer install 时查不到包,只报 Could not find package vendor/name。
- Git 仓库用
type: "vcs",URL 必须是可 clone 的地址(如https://git.example.com/repo.git),且根目录下要有合法composer.json - 国内镜像、Satis、Private Packagist 用
type: "composer",URL 必须提供packages.json接口(浏览器打开https://mirrors.aliyun.com/composer/packages.json应返回 JSON) - 验证是否命中:加
-vvv参数运行composer install,搜日志里Reading repository后面的 URL 是否是你配的地址 - 执行
composer show vendor/name,如果列出版本,说明源已生效;没反应或报错,大概率是type或 URL 错了
换源后 composer install 报 hash 不一致怎么办
镜像源内容和官方源理论上一致,但若 composer.lock 是旧源生成的,新源拉下来的包元数据可能有微小差异(比如 dist URL 路径不同),导致 hash 校验失败。
- 删掉
vendor/和composer.lock,再跑composer install - 不要只删
vendor留着composer.lock—— lock 文件里记录的是旧源的 dist 信息,新源不会匹配 - 团队协作时,务必把更新后的
composer.lock提交 Git,否则别人拉代码后仍会用旧 lock 文件,导致环境不一致 - CI 流水线里如果用了缓存
composer.lock,也要同步清理,否则构建会卡在 hash 验证
repositories 的数据结构类型和禁用官方源的那行 {"packagist.org": false} ——少了它,Composer 会双源并行查询,既慢又可能因权限或网络问题导致私有包安装失败。


















