Composer 的 minimum-stability 是硬性过滤门槛,决定哪些版本进入候选池;prefer-stable 仅在池内优先选择稳定版,不改变过滤规则。

Composer 默认只装 @stable 版本,其他如 @dev、@beta、@RC 都是显式“开闸”行为——不加配置或写错格式,它就当没看见。
为什么 composer require vendor/pkg:@beta 还报 “could not find package”
常见错误不是命令写错了,而是项目没打开 beta 的准入权限。Composer 会先按 minimum-stability 过滤候选版本池,再在里面匹配你写的约束。如果你的 composer.json 没设 "minimum-stability": "beta",那哪怕你写了 @beta,Composer 也根本不会把 v2.0.0-beta1 放进可选列表里。
-
@rc(小写)会被完全忽略,退回到默认@stable行为;必须写成@RC -
^2.0@beta只匹配带-beta后缀的标签,不匹配dev-main或2.0.0-RC1 - 子依赖包自己声明了
"minimum-stability": "dev",会覆盖你项目的设置,导致你明明设了stable,结果还是拉了dev版 - 运行
composer show vendor/pkg --all看真实发布记录,确认它确实打了beta标签,而不是只有RC或dev-main
minimum-stability 和 prefer-stable 到底谁管用
minimum-stability 是硬性门槛,决定哪些版本能进候选池;prefer-stable 只是在池子里挑人时“偏好更稳的那个”,它不拦人、不过滤、不拒绝。
- 设
"minimum-stability": "beta"+"prefer-stable": true:有2.0.0和2.0.0-beta1时选前者;但若只有2.0.0-RC1,它照装不误(因为 RC ≥ beta) - 只设
"prefer-stable": true不设minimum-stability:基本无效,因为默认minimum-stability就是stable,池子里本来就没别的 - 想彻底锁死只装稳定版?必须同时满足:
"minimum-stability": "stable"+"prefer-stable": true
什么时候该用 @dev,什么时候该用 --stability=dev
@dev 是精准授权:只对那个包生效,且明确指向分支或快照;--stability=dev 是临时放宽全局门槛,影响本次命令所有未显式指定 stability 的依赖。
-
composer require vendor/pkg:dev-main会失败,除非你同时加--stability=dev或已设minimum-stability: dev -
dev-main不是版本号,是分支别名;它不走语义化版本逻辑,每次composer update都可能拉新提交,不适合生产环境 - 私有包或内部调试用
@dev更安全;CI/CD 流水线中临时装一个 beta 包,用composer update vendor/pkg --stability=beta更可控 -
@dev允许的范围最宽:包括dev-main、dev-develop、3.1.0-dev,甚至3.1.0-alpha1(只要包作者打了这个 tag)
真正容易被忽略的是稳定性等级的**单向过滤性**:设 beta 就永远看不到 dev,设 RC 就永远看不到 beta 以下——它不是“推荐”,是“禁止”。而 @RC 必须全大写这种细节,在 CI 日志里出错时,往往要翻三遍配置才意识到是大小写问题。











