minimum-stability是硬性过滤门槛,决定哪些版本进入候选池;prefer-stable仅在池内优先选稳定版,不改变过滤规则。未设"minimum-stability":"beta"时,@beta约束无效,因beta版本根本未入池。

项目依赖了不稳定的版本,不是因为 Composer “失控”,而是 stability 控制逻辑被绕过或配置不匹配——minimum-stability 是硬过滤闸,prefer-stable 只是池子里挑人时的偏好,两者不配对就等于没设防。
为什么 composer require vendor/pkg:@beta 还报 “Could not find package”
根本原因不是包不存在,也不是网络问题,而是 Composer 解析分两步:先按 minimum-stability 过滤候选版本池,再在里面匹配你的 @beta 约束。如果项目没设 "minimum-stability": "beta",那 v2.0.0-beta1 根本不会进池子,@beta 就没机会起作用。
-
@rc(小写)会被完全忽略,退回到默认@stable行为;必须写成@RC - 子依赖包自己声明了
"minimum-stability": "dev",会覆盖你项目的设置,导致你明明设了stable,结果还是拉了dev-main - 运行
composer show vendor/pkg --all确认它真实打了beta1标签,而不是只有dev-main或-RC1 - 删掉
composer.lock里该包对应条目,再跑composer update vendor/pkg --with-all-dependencies,否则 lock 文件会缓存旧策略
minimum-stability 和 prefer-stable 到底谁管用
minimum-stability 是硬性门槛,决定哪些版本能进候选池;prefer-stable 只在池内优先选更稳的那个,它不拦人、不过滤、不拒绝。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 设
"minimum-stability": "beta"+"prefer-stable": true:有2.0.0(stable)和2.0.0-beta1(beta)时选前者;但若只有2.0.0-RC1,它照装不误(因为 RC ≥ beta) - 只设
"prefer-stable": true不设minimum-stability:基本无效,因为默认minimum-stability就是stable,池子里本来就没别的 - 想彻底锁死只装稳定版?必须同时满足:
"minimum-stability": "stable"且require中所有条目都不带@dev/@beta等显式降级标记
怎么确认当前到底装的是不是稳定版
别只信 composer.json 里的文字,得看实际解析结果。最直接的方式是查 composer.lock 里对应包的 version 字段,或者用命令实时验证:
- 运行
composer show vendor/pkg,看versions列表里第一个(通常是默认安装的)是不是无后缀的数字版本,如3.2.0而非3.2.0-beta1 - 运行
composer depends vendor/pkg,确认没有其他包在require里偷偷加了@dev或@RC - 检查
composer.lock中该包条目的source字段:type是git且reference是 commit hash,大概率是dev-main;如果是dist且url指向.zip包,基本可判定是 tag 发布版
真正容易被忽略的点在于:子依赖包自己的 minimum-stability 声明会覆盖顶层设置,而 composer.lock 一旦固化了某个 dev-main 的 commit,下次 install 就会继续用它——哪怕你已经删光了所有 @dev 标记。










