装 beta、RC 或 dev 版本需显式版本约束,因 minimum-stability 仅对未写死稳定性的 require 条目生效;RC 必须全大写,prefer-stable: true 必须与 minimum-stability 同时配置才有效。

想装 beta、RC 或 dev 版本,光改 minimum-stability 不够,必须配合显式版本约束,否则 Composer 直接跳过——不是找不到包,是压根不把它放进候选列表。
为什么改了 minimum-stability 还是装不上 dev-main?
因为 minimum-stability 只对 没写死稳定性后缀 的 require 条目生效。比如你只写 "monolog/monolog": "^3.0",Composer 才会按 minimum-stability 去筛版本;但如果你写的是 "monolog/monolog": "dev-main",它就直接去抓分支,根本不管全局设置。
- 常见错误:把
minimum-stability设成dev,却还在 require 里写"vendor/pkg": "^2.0"—— 这时 Composer 确实会考虑dev-main,但前提是该包真有这个分支且被 Packagist 正确索引 - 更安全的做法:保持
"minimum-stability": "stable",只对目标包加后缀,例如"phpunit/phpunit": "dev-main@dev" - 私有包或 GitHub 直链必须先配好
repositories,否则即使写了@dev也会报Could not find package
RC 必须全大写,rc 或 Rc 都无效
这是 Composer 唯一强制大小写的稳定性标识。设 "minimum-stability": "rc" 或 "require": {"pkg": "^1.0@rc"},Composer 会静默忽略,退回到 stable 行为,导致 v2.0.0-RC1 根本不会被匹配。
- 正确写法只有
"minimum-stability": "RC"和"pkg": "^1.0@RC" - beta、alpha、dev、stable 全部小写,唯独 RC 是例外
- 运行
composer show pkg --all可确认远程是否存在带-RC1后缀的真实标签
间接依赖不认你的 minimum-stability
你项目里设了 "minimum-stability": "beta",不代表 monolog 装 psr/log 时也会用这个门槛——monolog 自己的 composer.json 怎么写,它就怎么选它的依赖。
- 遇到
your-project → monolog → psr/log报错,别急着调低自己的minimum-stability - 先查
composer show monolog/monolog 1.25.0 --tree,看它实际拉的是哪个psr/log版本 - 再用
composer why-not psr/log dev-main(需 Composer 2.5+)定位是哪个上游包锁死了稳定性 - 解决方案通常是提 PR 改上游,或 fork 后 patch 它的
composer.json,而不是污染自己项目
prefer-stable: true 不是可选项,是必选项
设了 "minimum-stability": "beta" 后,Composer 在 ^2.0 约束下可能选 2.1.0-beta2 而不是已发布的 2.0.5(stable)。没有 prefer-stable: true,放宽稳定性反而更容易引入不稳定代码。
-
prefer-stable: true必须和minimum-stability同时存在才生效,单独写没用 - 它不改变可安装范围,只在满足约束的多个版本中,优先挑 stability 更高的那个
- CI 环境里漏掉它,又用了
dev级别,会导致每次composer install拉到不同 commit,构建不可重现
真正麻烦的从来不是改哪一行配置,而是搞清哪一层在起作用:是你项目顶层的 minimum-stability,还是某个间接依赖自己硬写的 "psr/log": "dev-main",又或者只是远程仓库根本没推送那个分支。动手前,先跑 composer show 和 composer why-not,比盲目调低稳定性靠谱得多。











