minimum-stability是全局过滤闸而非开关,设为"rc"仅允许rc及更稳版本(如stable),跳过beta及以下;必须置于composer.json根层级,配合prefer-stable:true才能在候选中优先选更稳版本。

用 minimum-stability 控制全局最低稳定性
Composer 默认只允许安装 stable 版本,但如果你的项目依赖了带 beta 或 RC 标签的包(比如某 SDK 尚未发布正式版),就得显式放宽限制。关键不是“限制最低”,而是“声明可接受的最低稳定性等级”。
minimum-stability 是一个全局配置项,写在 composer.json 的根层级,它不指定具体包,而是为所有未显式标注稳定性的依赖设下底线:
-
"minimum-stability": "stable"—— 默认值,拒绝RC、beta、alpha、dev -
"minimum-stability": "RC"—— 允许RC及更稳定的版本(即也包括stable),但跳过beta及以下 -
"minimum-stability": "dev"—— 允许所有,包括dev-master,生产环境严禁
⚠️ 注意:minimum-stability 本身不锁定版本,只是过滤候选版本池;真正决定装哪个版本的,还是 require 里的约束(如 ^2.1)和 composer.lock。
对单个包覆盖 minimum-stability:用 stability-flag
你不能也不该为整个项目降级 minimum-stability,只为引入一个 beta 包。正确做法是保持全局为 stable,仅对那个包加稳定性标记:
在 require 中写成:
"monolog/monolog": "3.0.0@beta"
或更常见的是直接写带标签的版本约束:
"acme/sdk": "1.2.0@RC"
这样 Composer 会忽略全局 minimum-stability,只为这个包启用对应稳定性级别。其他包仍严格走 stable 路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
✅ 这种写法等价于在 composer.json 里加 "stability-flags": { "acme/sdk": "RC" },但行内 @ 更直观、无需额外字段。
为什么 dev-master 和 * 不是“最低稳定版”,而是失控开关
很多人误以为 "package/name": "dev-master" 是“用最新稳定版”,其实完全相反:
-
dev-master指向master分支的 HEAD commit,可能含未测代码、API 删除、PHP 8.3 语法——它连alpha都不算,是纯开发快照 -
"*"的行为取决于当前minimum-stability:默认stable时它可能装2.0.0,但若某处临时设了"minimum-stability": "dev",它就可能拉dev-main,CI 构建突然失败
这类写法绕过了所有稳定性控制,等于把版本决策权交给网络请求时刻的远程仓库状态——这不是“限制最低稳定版”,是放弃限制。
prefer-stable 是软性兜底,不是硬性锁
即使你写了 "minimum-stability": "RC",Composer 默认仍倾向选 stable 版本(如果满足约束)。但这个倾向可被显式版本号覆盖:
开启 prefer-stable 后:
- 当
^2.0约束下同时存在2.1.0(stable)和2.1.0-RC1(RC),Composer 会选2.1.0 - 但如果约束是
"2.1.0@RC",那prefer-stable就不生效——你明确要 RC
所以它只是降低“意外装到非 stable 版”的概率,不能替代 minimum-stability + 显式约束的组合。生产环境必须同时设 "minimum-stability": "stable" 和 "prefer-stable": true,再配合 composer.lock 提交。
最易被忽略的一点:修改 minimum-stability 或添加 @ 标记后,必须运行 composer update(而非 install)才能让新策略生效——因为 install 只读 composer.lock,而锁文件里记录的是旧解析结果。










