应优先使用 composer install 而非 update;update 会重算依赖树、更新 lock 文件,风险高;版本约束(如 "^2.0")阻止主版本升级,需手动修改 composer.json 并指定包名更新。

别用 composer update 直接更新项目,它不是“升级按钮”,而是重装整个依赖树的高风险操作——95% 的场景该用 composer install。
为什么 composer update 后包没变?
不是命令失效,是 composer.json 里的版本约束卡死了。比如写的是 "monolog/monolog": "^2.0",哪怕 3.0 已发布,Composer 绝对不会装,因为主版本跨越可能破坏兼容性。
- 先查真实状态:
composer show monolog/monolog看当前装的版本;composer outdated看哪些包有可升版本(带!表示主版本可升但被约束拦住) - 想升主版本(如 2→3)?必须手动改
composer.json对应行,把"^2.0"改成"^3.0",再跑composer update monolog/monolog - 改完不提交
composer.lock?队友composer install还是旧版——lock 文件必须进 Git
只更新一个包,为什么子依赖没动?
默认行为就是如此:composer update vendor/package-name 只更新该包本身,不碰它的子依赖(比如 guzzlehttp/guzzle 依赖的 psr/http-message 还卡在 1.0.1)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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-all-dependencies,例如composer update guzzlehttp/guzzle --with-all-dependencies -
--with-dependencies在 Composer 2.2+ 已被彻底移除,执行会直接报错Unrecognized option: --with-dependencies
composer update 和 composer install 的本质区别
composer install 只按 composer.lock 装,不碰 composer.json;composer update 则以 composer.json 为准,重新算依赖树、更新 lock 文件。
- CI/CD 流水线必须用
composer install --no-interaction --optimize-autoloader(快、确定、可重现) - 本地开发想尝新功能或修 bug,才用
composer update;但必须带包名,禁止无参数运行 - 改了
composer.json却忘了update?install不会生效——因为 lock 文件没变 - PHP 版本升级后(如 8.1 → 8.2),必须确认
"platform": {"php": "8.2"}已写入composer.json,再删掉vendor/和composer.lock,然后composer update
怎么安全地更新 Composer 自身?
运行 composer self-update 即可,它只更新全局 Composer 可执行文件,不影响任何项目依赖。
- 官方安装方式(curl 安装到
$HOME/.local/bin)才支持self-update;apt/brew 安装的得走对应包管理器 - 权限报错?别急着
sudo,先查which composer和ls -l $(which composer),确认是不是软链接指向系统只读路径 - 指定版本降级或锁定:
composer self-update 2.5.8(必须精确匹配 GitHub release tag) -
--preview或--snapshot是给调试用的,CI/线上脚本里出现等于埋雷
真正难的从来不是命令怎么敲,而是判断「该不该重算依赖树」——composer.lock 是契约,composer.json 是意向,而 update 是撕毁契约重新谈判。每次执行前,先问自己:这次重谈,我准备好承担所有隐性变更了吗?










