Composer私有仓库配置必须满足:repositories为顶层字段且含type="vcs"和完整.git结尾的url;require包名须与私有库composer.json中name严格一致;必须显式禁用packagist.org;auth.json权限600且域名key精确匹配主机名。

composer.json里repositories必须是顶层数组,且type只能是vcs
Composer 不会扫描子配置或全局 config.json 里的 repositories;它只认项目根目录 composer.json 中顶层的 repositories 字段。写错位置(比如塞进 config 或 extra)等于没配。
每个仓库对象必须包含 type 和 url 两个键:
-
type只能是"vcs"(支持 Git/SVN/Hg),不能写成"git"、"github"或留空 -
url必须是能直接git clone的地址:SSH 格式如git@gitlab.example.com:org/pkg.git,HTTPS 格式如https://gitlab.example.com/org/pkg.git - 结尾必须带
.git;写成https://gitlab.example.com/org/pkg会导致No valid composer.json was found
require里的包名必须和私有仓库composer.json中name逐字符一致
这不是模糊匹配,而是严格字符串比对:大小写、连字符、斜杠位置全算在内。常见失败就是这里差一个字母。
使用约定式提交(Conventional Commits)从 Git 历史记录中生成结构化变更日志,支持多种格式、AI 增强型描述以及可自定义的范围……
- 私有包自己的
composer.json写的是"name": "Acme/utils",你在主项目require里写"acme/utils"→ 不匹配 - Git 仓库路径是
gitlab.example.com/team/subproject,但包名实际由私有仓库自己定义,不是路径推导出来的 - 如果私有包没打 tag,又想引用开发分支,必须加
dev-前缀,例如"acme/utils": "dev-main";写成"main"会被当成模糊约束去 Packagist 查,必然失败
auth.json权限600且域名key必须精确匹配URL主机名
Composer 不走系统 Git 凭据,只读 auth.json,而且对路径、权限、字段结构三者都敏感。
- 文件必须放在
~/.composer/auth.json(Linux/macOS)或%APPDATA%\Composer\auth.json(Windows) - 权限必须是
600:chmod 600 ~/.composer/auth.json,否则 Composer 直接跳过,不报错也不提示 - 域名 key 只取主机名部分:URL 是
https://gitlab.example.com:8080/group/repo.git,key 就得是"gitlab.example.com",不是"https://gitlab.example.com"也不是"gitlab.example.com:8080" - GitLab 用
glpat-开头的 Personal Access Token,填在http-basic的password字段;OAuth2 场景才用username: oauth2
packagist.org必须显式禁用,否则私有包永远被绕过
即使你写了私有仓库 URL,只要没关掉官方源,Composer 就会优先查 packagist.org,你的私有包根本不会被扫描。
- 在
repositories数组里,必须紧接添加{"packagist.org": false} - 这行不能省略,不能放数组外,也不能写成
"packagist": false或"packagist.org": "false" - 验证是否生效:运行
composer install -v,日志里应出现Reading composer.json of acme/utils和GET https://gitlab.example.com/api/v4/projects

















