composer 安装 git 分支需显式声明 vcs 类型与完整 url,分支名必须加 dev- 前缀,且 lock 文件锁定的是 commit hash 而非分支名,私有仓库还需配置 ssh 或 Token 认证。

Composer 可以直接安装 Git 仓库的任意分支,但必须显式指定 vcs 类型和完整 URL,仅写分支名不会生效。
用 require 指定分支时必须写完整 Git URL
很多人误以为加个 "dev-feature/x" 就能拉分支,其实 Composer 默认只认 packagist.org 上发布的版本。要装分支,得把包源换成 Git 地址:
- 错误写法:
"vendor/package": "dev-feature/x"(Composer 会去 Packagist 找这个“版本”,通常 404) - 正确写法:
"vendor/package": "dev-feature/x as 1.0.0"+ 在repositories中声明 Git 源
更稳妥的是直接在 repositories 里定义,并在 require 中引用该仓库的分支:
{ "repositories": [ { "type": "vcs", "url": "https://github.com/vendor/package.git" } ], "require": { "vendor/package": "dev-feature/x" } }
dev- 前缀不是约定而是强制要求
Composer 对分支名的解析规则是:所有非语义化版本(如 main、develop、fix/auth)都必须加 dev- 前缀才能被识别为开发分支:
-
"dev-main"→ 拉main分支 -
"dev-develop"→ 拉develop分支 -
"dev-fix/auth"→ 拉fix/auth分支(注意斜杠需保留) -
"main"或"develop"单独写 → Composer 当作无效版本号,报Could not find package
分支安装后 composer.lock 记录的是 commit hash,不是分支名
这是关键细节:即使你写的是 "dev-main",Composer 实际锁定的是当前 HEAD 的 commit hash,下次 composer install 会精确还原该提交,而非动态更新到最新 main:
- 想每次拉最新,得加
"minimum-stability": "dev"+"prefer-stable": false,但仍不保证自动 fetch 分支头 - 真正动态更新需手动
git pull本地 vendor 包,或删掉vendor/vendor/package后重装 - CI/CD 中依赖分支包时,务必确认
composer.lock提交的是预期 commit,否则不同环境可能拉到不同代码
私有 Git 仓库需要额外配置认证
如果 URL 是 git@github.com:xxx/yyy.git 或内网 gitlab,Composer 默认无法 clone:
- SSH 方式:确保当前用户
~/.ssh/id_rsa已添加到对应 Git 服务,且ssh -T git@github.com能通 - HTTPS + Token:把 token 写进 URL,如
"https://token:x-oauth-basic@github.com/vendor/package.git"(注意安全,别提交到公开 repo) - 推荐用
git config --global url."https://token:x-oauth-basic@github.com/".insteadOf "https://github.com/"统一代理
分支安装看着简单,但 commit 锁定机制、dev- 前缀强制性、私有源认证这三点最容易出问题,尤其是团队协作时 lock 文件没更新或 URL 权限失效,CI 构建就会静默失败。