直接使用 composer require vendor/package:dev-branch 即可安装开发分支,如 composer require monolog/monolog:dev-main;无需 @dev 后缀或 --stability=dev,但需确保分支在 packagist 可见或已配置私有仓库源,且项目 minimum-stability 设为 dev 才能生效。

怎么用 composer require 装 dev 分支
直接装 dev- 开头的版本名就行,Composer 会自动识别为开发分支而非稳定版。比如想装 monolog/monolog 的 main 分支,命令是:
composer require monolog/monolog:dev-main注意不是
dev-main@dev,也不是加 --stability=dev——后者只影响依赖解析策略,不指定具体分支。
常见错误现象:Could not find package xxx at version dev-xxx,大概率是因为该分支名在 Packagist 上没被索引(比如私有 GitLab 仓库未配置 webhook),或拼写错了(dev-master 已被弃用,多数新项目用 dev-main 或 dev-develop)。
- 使用场景:调试上游未发版的修复、验证 PR、对接内部 fork 的修改
- 参数差异:
dev-main是分支名,不是版本约束符;不能混用^或~,否则 Composer 会报错 - 性能影响:首次安装会 clone 整个仓库,比装 tag 慢;后续更新时若分支变动大,可能触发全量重下载
为什么 composer.json 里写 "dev-main" 不生效
因为 Composer 默认只允许安装 stable 稳定版,除非显式放宽稳定性要求。即使 composer.json 的 require 字段写了 "monolog/monolog": "dev-main",运行 composer install 时仍可能跳过它,转而装一个满足 ^2.0 的 stable 版。
解决办法只有一个:在 composer.json 根级加 "minimum-stability" 并设为 "dev",同时建议加上 "prefer-stable": true 防止所有依赖都退化成 dev 版:
"minimum-stability": "dev",<br>"prefer-stable": true
- 容易踩的坑:只改
require不调minimum-stability,等于白写 - 兼容性影响:整个项目依赖树都会接受 dev 版,CI 可能因随机提交哈希失败;上线前务必锁死
composer.lock
dev- 版本和 dev-xxx#commit-hash 的区别
前者指向分支最新 commit,每次 composer update 都可能变;后者硬编码到某次提交,内容固定、可复现。例如:dev-main#abc1234 表示 main 分支上哈希为 abc1234 的那次提交。
推荐在调试阶段用 dev-main 快速跟进,确认问题修复后再切到具体 commit 锁定版本。
- 使用场景:协作排查时共享可复现环境;上线前冻结依赖
- 性能影响:带 commit hash 的版本不会触发 branch 更新逻辑,
composer update更快 - 注意:commit hash 必须是完整 40 位(或至少前 7 位),
dev-main#abc会被忽略
私有仓库的 dev 版本装不上怎么办
Packagist 不索引私有 Git 仓库的分支,所以 composer require vendor/pkg:dev-main 会报 Could not find package。必须先在 composer.json 里声明仓库源:
"repositories": [<br> {<br> "type": "vcs",<br> "url": "https://gitlab.example.com/vendor/pkg"<br> }<br>]
然后才能正常 require。如果用 SSH 地址(如 git@gitlab.example.com:vendor/pkg.git),确保本地已配好 SSH key 且能 git clone 成功。
- 常见错误现象:提示
Failed to clone https://...,其实是认证失败,不是 Composer 问题 - 关键点:vcs 类型仓库只支持 Git/Svn/Hg,不支持 HTTP 目录列表;GitHub/GitLab 私有项目需配置 token 权限(如
read:packages)
dev-main —— 即使加了 prefer-stable,只要上游分支一推新 commit,composer update 就可能拉进不兼容改动。










