composer update不加参数会丢弃composer.lock、重解析整个composer.json并安装最新兼容版本,引入运行时不确定性;真·局部更新须指定包名如composer update vendor/package-name,仅更新该包及其必要直系依赖。

composer update不加参数就是在制造不确定性
裸跑 composer update 等于放弃版本控制权。它会丢掉 composer.lock,重新解析整个 composer.json,从 Packagist 拉取所有满足约束的最新兼容版——哪怕只是小版本升级,也可能触发底层行为变更:HTTP 超时缩短、日志字段重命名、测试断言逻辑收紧。这些不会报错,但上线后才暴露。
常见错误现象:Your requirements could not be resolved,大概率是本地 PHP 版本或扩展缺失,不是依赖冲突;composer update 失败时卡在 metadata 获取阶段,无超时提示,纯靠等。
- CI/CD 流水线里禁止出现裸
composer update,否则每次构建都可能装出不同依赖 - 想看影响范围?先跑
composer update --dry-run,再git diff composer.lock审查 SHA 变更 - 升级后出问题?立刻
git checkout composer.lock && composer install,比查 changelog 快十倍
只更新一个包:用 composer update vendor/package-name
这才是真·局部更新。它只按 composer.json 中该包的版本约束(比如 "monolog/monolog": "^2.8")拉取最新兼容版(如 2.10.0),仅顺带更新其直系依赖中未被其他顶层包锁死的部分(如 psr/log 若需升到 ^2.0 才能装 monolog 2.10,就会升),其余包完全不动。
常见错误现象:运行 composer update monolog/monolog 后,laravel/framework 也变了——大概率是你输成了 composer update,或用了带空格的引号(如 composer update "monolog/monolog")导致 shell 忽略参数。
- 目标包若非直连依赖(即没写在
composer.json的require或require-dev里),命令会直接报错 - 想升主版本(如从 ^2.0 到 ^3.0)?必须先手动改
composer.json对应行,再执行该命令 -
--with-dependencies在 Composer 2.2+ 已被移除,执行会报错Unrecognized option: --with-dependencies
连带更新直系依赖:用 --with 而不是 --with-dependencies
默认情况下,composer update vendor/package-name 不动它的子依赖。比如更新 guzzlehttp/guzzle,psr/http-message 还卡在 1.0.1。这不是 bug,是设计使然。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
要让它连带更新指定直系依赖,用 --with 参数:
composer update guzzlehttp/guzzle --with psr/http-message
注意:多个包用空格分隔,不是逗号;--with 后面跟的是包名,不是路径或文件名。
- 若想彻底更新整棵依赖树(含子依赖的子依赖),用
--with-all-dependencies,例如composer update guzzlehttp/guzzle --with-all-dependencies -
--with-all-dependencies会把整个依赖图里所有能升的都升一遍,风险远高于单包更新,慎用 - 别用
--ignore-platform-reqs跳过 PHP 版本检查——那是临时调试手段,不能进脚本,也不能提交
升级前必须确认的三件事
很多人改完 composer.json 就直接 composer update,结果发现什么都没变。核心原因就三个:
- 版本约束卡死了:运行
composer outdated --direct,带!标记的表示有主版本可升,但当前约束不允许(如"monolog/monolog": "^2.0"挡住了 3.0.0) - 被其他包强约束:比如
"foo/bar": "1.2.3"写死在composer.json,而它又依赖旧版monolog,那monolog就升不了 -
composer.lock没提交:改完约束并成功update后,composer.lock一定变,不git add和git commit,队友composer install还是旧版
最常被忽略的一点:Composer 不会自动帮你判断“该不该升”。它只忠实地执行约束,而约束是否合理、升了会不会 break,得人来拍板。










