正确做法是将包版本写死在composer.json中并提交composer.lock:如"monolog/monolog": "2.9.1"(无^/~),确保minimum-stability为stable,禁用无参数composer update。

composer update 时跳过某个包不更新
直接加 --with-dependencies 不管用,真正生效的是 --with 和 --without ——但注意,composer update 本身不支持 --without,得换命令。
正确做法是用 composer update 显式列出要更新的包,把不想动的彻底排除在外:
- 想更新所有包,唯独不动
monolog/monolog:运行composer update --with-all-dependencies不行,它会连带更新 monolog;应该用composer update vendor/package1 vendor/package2,手动列全其他依赖(不含 monolog) - 更稳妥的做法是先查当前已装版本:
composer show monolog/monolog,确认它是2.9.1,再在composer.json的require里把它写死成"monolog/monolog": "2.9.1"(不带^或~) - 如果该包是子依赖(没出现在
require里),就得靠composer.lock锁定:确保composer.lock已提交,且团队都禁用composer update全量执行
用 composer.lock 硬性阻止特定包升级
composer.lock 是实际生效的版本清单,只要它存在、没被删、没被 composer update 覆盖,指定包就不会变——但有个关键前提:你不能运行 composer update 时不加参数。
常见翻车点:
- CI/CD 脚本里写了
composer update(无参数),等于全量刷新,lock文件里锁的版本直接被忽略 - 本地执行
composer require some/pkg时,如果它依赖更高版的monolog,Composer 会强制升级并重写lock,哪怕你之前锁死了 - 解决办法:把关键包加入
composer.json的require并写死版本,例如"phpunit/phpunit": "9.6.13",这样即使其他操作触发更新,它也会被当作根依赖优先保护
require-dev 里的包也被 update 波及?
默认情况下 composer update 会同时处理 require 和 require-dev,除非你明确关掉 --no-dev。但问题常出在:你想锁住 phpunit/phpunit,但它只在 require-dev 里。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
这时必须同样写死版本,并注意:
-
composer update --no-dev不会影响 dev 包,但你也更新不了它们——不是“跳过”,而是“完全不加载” - 如果 CI 需要跑测试,又不允许升级 phpunit,就得在 CI 配置里固定
COMPOSER_NO_INTERACTION=1+ 确保composer.lock提交且未被修改 - 某些插件(如
hirak/prestissimo)已停用,新版 Composer 默认并行下载,但不影响锁定逻辑
为什么 “minimum-stability” 和 “prefer-stable” 会绕过你的锁定
这两个配置不直接改版本号,但会改变 Composer 解析约束时的倾向性。比如你写了 "monolog/monolog": "2.9.1",看着很死,但如果 "minimum-stability": "dev",Composer 可能无视你写的精确版本,去拉一个 dev-main 分支——尤其当其他依赖强烈要求时。
检查点:
- 确认
composer.json里没有"minimum-stability",或设为"stable" - 确认没配
"prefer-stable": false(默认是 true,别手抖改成 false) - 运行
composer why-not monolog/monolog:2.9.1查谁在拖后腿,有时是间接依赖在搞鬼
最硬的防线永远是:写死版本 + 提交 composer.lock + 禁止无参数 composer update。其余都是辅助,一松就漏。










