需在项目根composer.json的repositories中显式声明type为"vcs"的Git仓库条目,URL支持https、git@、ssh格式,且name字段须与目标仓库composer.json中完全一致;默认不装dev分支,需设minimum-stability为dev或使用dev-main as 1.0.0别名。

怎么让 Composer 从 Git 仓库装包?必须配 repositories 且 type 是 vcs
Composer 不会自动把任意 Git 地址当包源——哪怕你写了 https://github.com/xxx/yyy 在 require 里,它也只会去 Packagist 查,根本不会碰你的仓库。
真正起作用的是 repositories 数组里显式声明的 type: "vcs" 条目。漏掉 type 或错写成 "git"、"github",全白搭。
-
repositories必须写在项目根目录的composer.json顶层,不是子包里也不是全局配置 - URL 支持
https://、git@、ssh://,但别混用认证方式(比如 HTTPS 配了 token 又在 URL 里塞私钥路径) - GitLab 私有项目 URL 必须是
git@gitlab.com:group/project.git这种克隆地址,不能是网页链接https://gitlab.com/group/project - 运行
composer show vendor/package能列出才说明命中了;如果报Could not find package,八成是name字段不一致或仓库没被识别
为什么 dev-main 装不上?检查 minimum-stability 和分支是否存在
默认情况下 Composer 只接受 stable 版本,而 VCS 仓库里往往只有 dev-main、dev-develop 这类开发分支——它直接跳过,连试都不试。
- 要么在
composer.json加上"minimum-stability": "dev",并配"prefer-stable": true平衡稳定性 - 要么在
require中明确用"vendor/name": "dev-main as 1.0.0"做版本别名映射(避免后续 require 写死^1.0失效) - 确保目标分支(如
main)根目录下真有composer.json,且里面"name"和require里写的完全一致(大小写敏感) - 用
git ls-remote https://github.com/vendor/repo.git看能不能列出 ref,确认远程分支名拼写无误
私有仓库总卡在认证失败?别往 composer.json 里塞密码
HTTPS 方式下,把 token 直接写进 URL(如 https://token@github.com/...)已被现代 Git 客户端拒绝;SSH 方式下,ssh-add -l 看不到密钥,或者 ~/.ssh/config 没配对主机别名,都会导致 authentication failed。
- 推荐用
auth.json:放在COMPOSER_HOME(通常是~/.composer/auth.json),权限设为600,内容严格小写,例如:{"http-basic": {"gitlab.example.com": {"username": "gitlab-ci-token", "password": "glpat-xxx..."}}} - GitHub 更推荐全局配置 token:
composer config -g github-oauth.github.com - CI 环境别依赖本地
auth.json,改用环境变量COMPOSER_AUTH注入 JSON 字符串 - 验证是否生效:运行
composer install -vvv,看日志里有没有Reading repository对应你的 URL,以及后续是否出现401或Cloning into
能用 path 或 artifact 替代 vcs 吗?看场景选对类型
vcs 是最常用也最灵活的方式,但它依赖网络、Git 认证和远程仓库状态。有些场景换其他类型反而更稳。
- 本地快速调试用
"type": "path",比如"url": "../my-local-package",完全绕过网络和认证,但上线前必须手动替换成真实 VCS 地址 - 发布归档包(ZIP/TAR)用
"type": "artifact",指向一个本地或 HTTP 目录,文件名必须是vendor-name-version.zip格式,不支持分支,只认固定版本 -
"type": "package"是纯静态描述,适合无源码、只有 dist 的情况,但每次改版本都得手动更新dist.url和shasum,维护成本高 - 团队级私有生态建议上
"type": "composer"(如 Satis 或 Private Packagist),它把所有包聚合为标准packages.json接口,比一堆 VCS 更可控、更快
VCS 看似简单,但真正卡住人的从来不是语法,而是「Composer 没有去拉你的仓库」这个事实本身——它不报错,只是安静地跳过。盯住 composer show 输出和 -vvv 日志里的 Reading repository 行,比反复改 require 有用得多。











