真正安全的做法是精确控制、分步验证、依赖锁定;全量 update 易引发冲突,应禁用 --no-update 分步操作,锁文件与平台配置须严格一致,冲突时优先用 --dry-run 和 why-not 定位而非重置。

别用 composer update 全量更新,它几乎必然引发冲突;真正安全的做法是精确控制、分步验证、依赖锁定。
为什么 composer update 默认就是危险操作
它会忽略 composer.lock,重新跑一遍 SAT 求解器,穷举所有包的版本组合。只要项目里有 20+ 包、含 conflict 或 replace 字段、或存在 dev 分支依赖,就极易卡在 Resolving dependencies 阶段,或给出一个你根本没测试过的版本组合。
- 报错不是“网络慢”,而是约束无交集——比如
package-a要monolog/monolog:^2.0,package-b却硬绑monolog/monolog:1.26.1 -
composer update不区分require和require-dev,可能把phpunit/phpunit升到要求 PHP 8.3 的版本,而你的生产环境只装了 8.1 - 全量更新后若不提交
composer.lock,CI 流水线跑的就不是你本地验证过的依赖树
只更新单个包时,必须加 --no-update 再手动 update
直接 composer require vendor/package:2.9.1 或 composer update vendor/package 看似方便,实则绕过关键干预点:你无法控制它的依赖连带行为。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先运行
composer require vendor/package:2.9.1 --no-update—— 只改composer.json,不触发解析 - 再运行
composer update vendor/package—— 此时 Composer 以该包为根重算子图,影响范围可控 - 若仍冲突,说明其他包也在强约束同一依赖,这时再用
composer why-not vendor/package:2.9.1定位封杀链
锁文件和平台配置必须严格匹配
composer.lock 不只是版本快照,它还固化了 platform 配置(如 php、ext-json 版本)。一旦 composer.json 里 config.platform.php 和 lock 文件记录的不一致,就会出现“本地能装、CI 报 ext-json 不满足”的情况。
- 检查命令:
composer show --platform对比composer.json中config.platform字段 - CI 中务必加
ls -la composer.lock和composer validate作为前置步骤 - 团队协作时,
composer.lock必须提交,且不能被.gitignore忽略——否则依赖一致性就不存在
复杂冲突优先用 --dry-run -v 和 why-not 定位,而不是删 vendor
删 vendor/ 和 composer.lock 是重置手段,不是排查手段。它掩盖了谁在提什么约束,让问题更难复现。
- 先跑
composer update --dry-run -v,看日志里反复出现的Trying和回退路径,找到第一个失败点 - 对那个包执行
composer why-not vendor/package:desired-version,输出里最上面几行就是直接阻断源 - 用
composer show -t | grep package确认它是否被require-dev里的测试工具悄悄拉入——这种间接依赖最容易被忽略
真正难处理的从来不是“装不上”,而是“装上了但运行时报错”——比如你靠 || 语法兼容两个主版本,结果某处 API 已静默废弃。所以每次 composer update 后,必须跑真实业务逻辑,不能只看 composer install 成功。










