正确写法是使用"dev-分支名"格式并配置vcs仓库:{ "repositories": [{ "type": "vcs", "url": "https://github.com/vendor/package.git" }], "require": { "vendor/package": "dev-main" }}。

composer install 指定 Git 分支的正确写法
直接在 composer.json 里用分支名当版本号是常见误区,比如写 "dev-main" 或 "dev-develop" 看似合理,但 Composer 默认会拒绝安装未加 -dev 后缀的非稳定分支(即使远程存在),且不自动 fetch 最新提交。
必须显式声明为 dev- 前缀 + 分支名,并确保仓库 type 是 vcs(Git):
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/vendor/package.git"
}
],
"require": {
"vendor/package": "dev-main"
}
}
注意:dev-main 中的 main 是分支名,不是标签;Composer 会拉取该分支 HEAD 对应的 commit。
安装特定 commit 或带 ref 的 dev 版本
有时需要锁定到某个具体提交,或临时测试一个尚未合并的 PR 分支,这时不能只靠分支名 —— 分支可能被 force-push 覆盖,导致行为不可控。
- 用
dev-branch-name#commit-hash格式,例如:"dev-main#abc1234" - 也可以用
dev-branch-name#ref=xxx,其中ref可以是 tag、commit、甚至 GitHub PR 的 merge commit(如refs/pull/123/merge) - 如果项目未在 Packagist 注册,且你本地改了代码又想快速测试,可配合
pathrepository 类型,但要注意composer install会跳过 autoloader 生成,需手动运行composer dump-autoload
为什么 composer require vendor/package:dev-main 有时失败?
常见原因不是命令写错,而是 Composer 默认禁用不稳定包(minimum-stability 设为 stable),而 dev- 开头的版本一律视为 dev 稳定性级别。
解决方式有二:
- 临时允许:加
--stability=dev参数,即composer require vendor/package:dev-main --stability=dev - 永久允许(推荐仅限开发环境):在
composer.json顶层加"minimum-stability": "dev",并补上"prefer-stable": true防止意外装到其他 dev 包 - 别漏掉
"repositories"配置 —— 如果包不在 Packagist,不声明仓库地址,Composer 根本找不到源
dev 版本的 autoload 和更新陷阱
用 dev- 版本时,Composer 不会像 stable 版那样做优化缓存,每次 composer update 都会重新 clone 或 fetch,速度慢且容易因网络中断失败。
更关键的是 autoload 行为差异:
- 如果依赖包用了
psr-4但其composer.json中autoload没覆盖全部目录,dev 分支里新增类可能不被自动加载 -
composer update vendor/package不会自动 pull 新 commit,必须先git pull进入 vendor 下对应目录,或删掉整个vendor/vendor/package再重装 - CI/CD 环境中慎用
dev-版本 —— 缺少 commit 锁定,构建结果不可复现
真正要长期用某分支,最好让维护者打个 v1.2.3-dev 这样的预发布 tag,比裸用 dev-main 更可控。










