@beta 会安装 alpha 版本,因为 composer 将稳定性视为线性等级(dev > alpha > beta > rc > stable),@beta 表示接受 beta 及更不稳定版本,故可能降级至 alpha。

直接在 require 字段里加 @beta、@dev 或 @RC,比改 minimum-stability 更安全、更精准——它只影响那个包,不波及其他依赖。
为什么 @beta 会装到 alpha 版本?
因为 @beta 不是“只选 beta”,而是“beta 及更不稳定都可接受”。Composer 把稳定性看作一个线性等级:dev alpha beta RC stable。所以 "monolog/monolog": "^3.0@beta" 会匹配 3.0.0-alpha1、3.0.0-beta2,甚至 3.0.x-dev(如果存在且满足约束)。
若要锁死某一个 beta tag,必须写全版本号并显式带标记:"monolog/monolog": "3.0.0-beta2@beta"。
-
@dev必须显式书写,dev-main单独写会报No matching package found -
@RC大小写敏感,@rc或@Rc会被忽略,退回到项目默认的minimum-stability - 子依赖若自己声明了
"minimum-stability": "dev",会覆盖你项目的设置,prefer-stable: true拦不住它
minimum-stability 只对没显式标稳定性的包生效
它不是全局开关,而是一道“默认过滤闸”。设成 "minimum-stability": "stable" 后,"symfony/console": "^6.4" 会被限制在 stable 版本;但 "monolog/monolog": "dev-main@dev" 完全绕过它——后缀已明确,Composer 不查这个字段。
常见误判:改了 minimum-stability 却仍装出 dev 包,大概率是某个 require 项写了 dev-main 或 @dev,或者子依赖的 composer.json 里自带 minimum-stability: dev。
- 该字段必须放在
composer.json顶层,和require同级,塞进config或extra里无效 - 值必须小写(
dev/alpha/beta/RC/stable),RC必须全大写 - 改完必须运行
composer update --lock,否则composer.lock不更新,新规则不落地
生产环境别让 @dev 污染 composer.lock
一旦 composer.lock 里记了 dev-main 或 -alpha 提交哈希,后续执行 composer install --no-dev 也拦不住——--no-dev 只跳过 require-dev 和其传递依赖,不拒绝 lock 文件里已存在的不稳定主依赖。
CI 部署前务必确认 lock 文件干净:在隔离环境中运行 composer update --no-dev --lock,再提交。否则线上可能意外加载 dev 分支代码,行为不可控。
- 用
composer show -t vendor/pkg查子依赖树,重点扫它们的composer.json是否含minimum-stability: dev - 临时缓解可用
composer update --with-all-dependencies vendor/pkg,缩小污染范围 - 长期建议在 CI 中加脚本检查
composer.lock,grep"dev-或"-alpha"哈希,发现即阻断
真正难缠的不是怎么写 @beta,而是子依赖悄悄把 dev 版本拖进来——它不报错、不警告,只默默写进 lock 文件,等上线后才暴露。











