prefer-stable 是布尔开关,仅在依赖解析时优先选择最稳定候选版本(stable > rc > beta > alpha > dev),不改变已锁定版本、不覆盖显式指定的不稳定版本,需配合 minimum-stability 才能真正限制不稳定版本引入。

prefer-stable 是布尔开关,不是版本策略控制器
prefer-stable 的作用非常具体:当 Composer 遇到多个满足约束的候选版本(比如 ^2.0 同时匹配 2.0.0-beta.1、2.0.1、2.1.0-rc),它会**优先选其中最稳定的那个**——即 stable > RC > beta > alpha > dev。但它不会跳过不稳定的候选,也不会主动降级已安装的不稳定版本。
常见误解是设了 "prefer-stable": true 就能“杜绝 beta”,其实只要 composer.json 里写了 "monolog/monolog": "2.0.0-beta.1",它照装不误;同理,如果锁文件(composer.lock)里已记录 dev-master,prefer-stable 不会触发重装。
- 只在
require版本约束存在多个合法匹配时生效 - 不改变已有
composer.lock中的版本选择 - 不覆盖显式指定的不稳定版本(如
@beta、dev-main)
如何真正约束“只装 stable”?用 minimum-stability + prefer-stable 组合
单靠 prefer-stable 无法阻止不稳定版本进入依赖树,必须配合 minimum-stability。后者才是真正的准入门槛:
-
"minimum-stability": "stable":默认只接受stable版本,遇到beta直接报错(除非显式加@beta) -
"prefer-stable": true:在minimum-stability允许的范围内(比如设为beta),再挑更稳的那个
典型安全配置是:
{
"minimum-stability": "stable",
"prefer-stable": true,
"require": {
"symfony/console": "^6.4"
}
}
这样即使某个间接依赖在 dev 分支发布了兼容版,Composer 也会拒绝,而不是“偏好 stable 后退一步选 beta”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
运行时行为差异:install vs update 很关键
prefer-stable 在 composer install 和 composer update 中表现不同:
-
composer install:完全按composer.lock还原,prefer-stable不起作用 -
composer update或composer update foo/bar:重新解析依赖时,prefer-stable才参与决策
这意味着:如果你长期没跑 update,锁文件里可能积压着旧的 rc 版本,哪怕现在 prefer-stable 开着,也看不到变化。要清理,得显式执行 composer update --with-all-dependencies(并确保 minimum-stability 设对)。
容易被忽略的陷阱:平台包和插件不受 prefer-stable 控制
prefer-stable 只影响通过 require 声明的普通包。两类例外常导致意外不稳定版本:
-
platform包(如ext-gd、php):其版本由当前运行环境决定,Composer 不做稳定性判断 - Composer 插件(
composer-plugin-api):它们的稳定性由插件自身控制,prefer-stable不介入其解析逻辑
例如你项目依赖 phpstan/extension-installer,它又要求 phpstan/phpstan,而后者某次要更新到 1.10.0-rc.1 —— 如果你的 minimum-stability 不够严,这个 rc 就可能悄无声息地进来,prefer-stable 无能为力。










