minimum-stability设为stable仍装dev-main,因其仅为最低准入线,不拦截显式声明(如"dev-main"或"^3.0@dev"),也无法约束传递依赖中子包自设的minimum-stability: dev。

为什么minimum-stability设成stable还是装了dev-main
因为minimum-stability只是“最低准入线”,不是“最高限制”。它只对没显式标注稳定性的约束起作用,比如"monolog/monolog": "^3.0";一旦某处写了"monolog/monolog": "dev-main"或"monolog/monolog": "^3.0@dev",Composer 就直接绕过门槛。
更隐蔽的是传递依赖:你依赖的 A 包,在它自己的composer.json里声明了"minimum-stability": "dev",那它的子依赖 B 就可能被拉成dev-main,哪怕你项目里设了stable。
-
minimum-stability必须放在composer.json根对象层级(和require同级),写在config或extra里完全无效 - 改完后必须运行
composer update --lock,否则composer.lock仍锁着旧规则下的版本 -
dev-main不是语义化版本,每次composer update都可能拉新 commit,不适合生产环境
如何安全安装单个dev分支而不污染整个项目
别动全局minimum-stability。临时装一个开发分支,最可控的方式是用命令行参数精准授权:
composer require vendor/package:dev-main --stability=dev
这个参数会覆盖composer.json中的设置,仅对当前命令生效。关键点在于:必须同时指定分支名(如dev-main)和--stability=dev,缺一不可。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果包来自私有 Git 仓库,确保已配置
repositories,类型为vcs - 执行后,
composer.lock会记录具体 commit hash,而非分支名——下次composer install锁定该 commit,不会自动更新 - 若只想试用、不写进
composer.json,可用composer require --no-update vendor/package:dev-main --stability=dev,再手动composer update
prefer-stable和minimum-stability组合的真实行为
prefer-stable不改变规则,只影响“选择策略”——它本身不降低稳定性门槛。当两者共存时:
-
"minimum-stability": "dev"+"prefer-stable": true:Composer 会优先选 stable 版(只要存在),仅在无 stable 可选时才回落到 dev -
"minimum-stability": "stable"时,哪怕"prefer-stable": false,也装不上dev-main——因为底线卡死了,偏好没机会生效 - CI 环境里没配
prefer-stable,又用了minimum-stability: dev,结果每次composer install都随机装不同 commit 的dev-版本,构建不可重现
CI 流程中彻底拦截dev版本的硬手段
靠人肉 review composer.json或凭经验判断太不可靠。CI 中必须加一行脚本做最终兜底:
grep -q '"version":"dev-' composer.lock && exit 1
发现即失败,不给上线机会。注意:composer show -a查出来的dev-main (dev)不能直接信——它只说明 Packagist 索引到了这个分支,是否可用还取决于三件事:
- 该分支的
composer.json是否通过了 Packagist 的语法校验(缺autoload或name会静默跳过) - 仓库是否公开,或你的
auth.json是否配了对应 token(私有 GitLab/GitHub 仓库最常卡在这) - 该分支是否被其自身
composer.json的minimum-stability限制住(比如它自己设了"minimum-stability": "beta",那dev-main就不会被识别为有效候选)
所以composer show -a是起点,不是结论;看到dev-main (dev)后,务必跑一次composer require vendor/pkg:dev-main --dry-run --stability=dev看是否真能解析成功。










