必须同时设minimum-stability和prefer-stable,否则prefer-stable几乎不生效;它仅在minimum-stability筛选出的候选版本中优先选择更稳定的版本,若无候选则无事可做。

必须同时设 minimum-stability 和 prefer-stable,否则 prefer-stable 几乎不生效。 它不是开关,只是在多个满足门槛的版本里“挑一个更稳的”,没门槛可选,它就无事可做。
为什么只加 prefer-stable 没用?
Composer 的解析分两步:先按 minimum-stability 过滤出合法候选版本,再在这些候选里按 prefer-stable 排序。如果 minimum-stability 是 stable,而某包最新只有 2.1.0-RC1,那它根本进不了候选池——prefer-stable 连看都看不到它。
-
prefer-stable必须放在composer.json根对象层级,和require、minimum-stability并列;写进"config": { "prefer-stable": true }完全无效 - 单独设
"prefer-stable": true在 Composer 2.2+ 中会隐式提升minimum-stability到stable,但行为不一致,老版本可能直接忽略 - 改完后必须运行
composer update --lock或composer update vendor/package,composer install不会重算依赖
minimum-stability 是硬过滤闸,不是偏好开关
它决定哪些版本能参与选择:stable(默认)只认无后缀或 -stable 版本;RC 必须全大写,小写 rc 会被当成非法值退回到 stable;dev 最宽松,匹配 dev-main、v4.0.0-dev 等。
- 该字段必须在
composer.json根对象顶层,写在config或extra里完全被忽略 - 设为
dev后,prefer-stable仍起作用:比如2.5.3和dev-main都可用,它会优先选2.5.3 - 想彻底锁死只用稳定版?必须配对:
"minimum-stability": "stable"+"prefer-stable": true
怎么安全地为单个包放宽稳定性?
全局放宽 minimum-stability 风险高,容易把其他依赖也拖进不稳定状态。更推荐在 require 里为特定包显式加稳定性标记,它会覆盖项目级设置。
-
"monolog/monolog": "dev-main"或"monolog/monolog": "^3.0@dev"—— 强制走分支快照,不依赖 tag -
"some/pkg": "^2.0@beta"—— 兼容alpha和beta,但不包括RC或dev -
"vendor/pkg": "2.0.0-RC1"—— 注意RC必须全大写,@RC写法无效 - 报错
Could not find a version of package matching your minimum-stability,大概率是漏了@dev后缀,或拼错了(比如写了@rc1)
最容易被忽略的是 composer.lock 的固化效应:哪怕你已正确配置并运行了 composer update --lock,如果 lock 文件里还锁着 dev-main,下次 composer install 依然会装它。验证是否真生效,最可靠的方式是删掉 vendor 和 composer.lock,再跑一次 composer install。


















