要安装 beta 版本包,需同时设置 "minimum-stability": "beta" 和 require 中显式标注 @beta,并启用 "prefer-stable": true 以优先选择稳定版本;RC 必须全大写,dev 分支应单独指定而非降低全局 stability。

minimum-stability 不是“让所有包都变稳定”,而是告诉 Composer:“当没写清楚要哪个版本时,默认最多能退到哪一级别”。设成 stable(默认),dev-main 或 v3.0.0-beta1 就直接被过滤掉——不是找不到,是压根不考虑。
怎么改 composer.json 才能让 beta 包装得上?
核心就两步:改全局门槛 + 显式指定目标版本。只改 minimum-stability 不够,还必须让 require 里的约束能匹配到 beta 版本。
- 在
composer.json顶层加:"minimum-stability": "beta"(注意全小写,RC必须大写) - 同时,在
require里不能只写"vendor/package": "^2.0"——这个约束默认只找stable,得显式带上稳定性后缀:"vendor/package": "^2.0@beta" - 运行
composer update vendor/package,而不是全量update,避免意外升级其他依赖
为什么 prefer-stable: true 很关键?
设了 "minimum-stability": "beta" 后,Composer 理论上能装 beta、RC、stable,但不意味着它会自动挑最稳的那个——它可能因为版本号更高(比如 2.1.0-beta2 > 2.0.5)而选 beta 版,哪怕 stable 版完全满足约束。
-
"prefer-stable": true的作用是:在所有满足条件的版本中,优先选 stability 更高的那个 - 它不改变可安装范围,只改变选择偏好;没有它,
minimum-stability放宽反而容易引入不稳定代码 - 必须和
minimum-stability同时存在才生效,单独写prefer-stable没用
只想装一个 dev 分支,千万别动 global stability
把 minimum-stability 改成 dev 是最危险的操作——它会让所有没写死版本的依赖,都可能拉取 dev-main,连 symfony/console 都可能变成开发分支,项目第二天就跑不起来。
- 正确做法:保持
"minimum-stability": "stable",只对特定包加后缀:"monolog/monolog": "dev-main@dev" - 如果该包没有
dev-main分支,composer show monolog/monolog --all会帮你确认真实存在的分支名(比如是dev-master或dev-3.x) - 私有包或 GitHub 直链包,还需确保已配置好
repositories,否则即使写了@dev也会报Could not find package
常见错误:RC 写成 rc 或 Rc,结果还是装不上
RC 是唯一必须全大写的稳定性标识。写成 rc、Rc、rc1,Composer 都会静默忽略,退回到默认的 stable 行为——你明明写了 "minimum-stability": "rc",却依然装不了 v4.0.0-RC1,就是这个原因。
- 合法值只有:
stable、RC、beta、alpha、dev(全部小写,除了RC) - 命令行临时覆盖也一样:
composer update --stability=RC✅,--stability=rc❌ - 遇到 “找不到包” 先查
composer show,再确认 stability 拼写,比反复删 vendor 有效得多
minimum-stability 看似是个开关,实际是解析器筛选版本时的隐式过滤规则。它不控制“能不能装”,而控制“愿不愿意看”。真正决定装哪个版本的,永远是 require 里的约束字符串 + 这个门槛值的组合。漏掉任一环,都会卡在“明明写了却装不上”。










