Composer默认只装stable版,即使设了minimum-stability为beta,require中也必须显式加@beta等后缀才能匹配对应版本,否则该版本不会进入候选池。

必须显式加 @ 后缀才能生效,不写就默认只装 stable 版——哪怕你项目里设了 minimum-stability 为 beta,require 里没带 @beta,Composer 依然可能跳过 beta 版本。
为什么 composer require vendor/pkg:^2.0@beta 还报 “could not find package”
根本原因不是命令写错,而是 Composer 的解析分两步:先按 minimum-stability 过滤候选版本池,再在里面匹配你的约束。如果项目没设 "minimum-stability": "beta",那 v2.0.0-beta1 根本不会进池子,@beta 就没机会起作用。
-
@rc(小写)或@Rc会被完全忽略,退回到@stable行为;必须写成@RC - 子依赖包自己的
composer.json声明了"minimum-stability": "dev",会覆盖你项目的设置 - 运行
composer show vendor/pkg --all确认它真实发布了-beta1标签,而不是只有dev-main或-RC1 - 别只改
require,记得同步更新composer.json顶层的minimum-stability字段
minimum-stability 和 prefer-stable 到底谁管用
minimum-stability 是硬性过滤闸,决定哪些版本能进候选池;prefer-stable 只在池内选人时“偏好更稳的那个”,它不拦人、不过滤、不拒绝。
- 设
"minimum-stability": "beta"+"prefer-stable": true:有2.0.0(stable)和2.1.0-beta2(beta)时选前者;但若只有2.1.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更可控 - GitHub 私有仓库还需确保已配置
repositories,否则即使写了@dev也会报Could not find package
真正容易被忽略的是稳定性等级的单向过滤性:设 beta 就永远看不到 dev,但设 dev 却会把所有 alpha、beta、RC、stable 全放进来——这个“降级不可逆”的逻辑,决定了你不能靠 prefer-stable 把 dev 拦住。











