composer install 按 composer.lock 精确安装,保障部署一致性;composer update 重算依赖并升级至满足约束的最新兼容版本,可能引入不兼容变更,应谨慎使用。

直接说结论: composer update 会重新计算并安装最新兼容版本的依赖(无视 composer.lock),而 composer install 只按 composer.lock 中锁定的版本安装(不更新、不重算),是部署和协作时该用的命令。
为什么执行 composer update 后线上行为变了?
因为 update 会跳过 composer.lock,根据 composer.json 中的版本约束(比如 "monolog/monolog": "^2.0")拉取当前满足条件的**最新小版本或补丁版本**——哪怕只是 2.8.0 → 2.9.1,也可能引入不兼容的内部变更或新默认行为。
常见现象包括:单元测试突然失败、日志格式变化、HTTP 客户端超时逻辑不同、Laravel 的 cache:clear 命令报错等。
- 只在明确需要升级依赖时运行
composer update,例如修复安全漏洞(composer update --with-all-dependencies)或引入新特性 - 日常开发中,如果只是新增一个包,优先用
composer require vendor/package,它会自动触发一次受控的update并写入lock - CI/CD 流水线、生产环境部署脚本里,**必须用
composer install**,否则每次构建都可能拿到不同版本
composer install 报错 “Your lock file does not contain a compatible set of packages” 怎么办?
这是 composer.json 和 composer.lock 不一致导致的典型错误。常见于:多人协作时有人改了 composer.json 但没提交 lock,或你本地手动删过 lock 文件。
解决路径很明确:
- 先确认是否真的需要更新依赖:如果只是想让项目跑起来,就别碰
update,而是让队友把最新的composer.lock提交上来,然后你git pull后再composer install - 如果确定要同步
json的改动,就运行composer update --lock(仅更新 lock 文件,不重装包),或者更稳妥地composer update --dry-run先看会装哪些版本 - 绝对不要在 CI 脚本里加
--ignore-platform-reqs来绕过这个报错,那是掩盖问题,不是解决问题
什么时候该用 composer update?怎么控制范围?
update 不是“保持更新”的常规操作,而是有明确目标的维护动作。盲目全量更新风险高,应尽量缩小范围。
常用组合:
- 只更新某一个包:
composer update vendor/package-name(例如composer update phpunit/phpunit) - 只更新直接依赖(不碰子依赖):
composer update --no-dev --with-dependencies(慎用,仍可能连带升级) - 升级到某个主版本(如从 v1 升到 v2):
composer update vendor/package --with-all-dependencies,但务必先读 changelog,再本地测试 - 临时降级某个包(比如发现新版有 bug):
composer require vendor/package:1.5.3,它会自动 downgrade 并锁死该版本
注意:composer update 默认会更新 dev 包(如 phpunit),如果只想更新生产依赖,加 --no-dev 参数。
CI 环境里漏掉 composer.lock 或用了 update 会怎样?
后果是构建结果不可复现:今天通过的测试,明天可能因 guzzlehttp/guzzle 从 7.5.0 升到 7.6.0 而失败;线上发布的 phar 包,下次构建时内容已不同。
检查点必须包含:
-
composer.lock是否在 Git 中被跟踪(git ls-files | grep composer.lock) - CI 脚本中是否明确写了
composer install --no-interaction --prefer-dist --optimize-autoloader - 是否禁用了
COMPOSER_ALLOW_SUPERUSER等危险环境变量
真正麻烦的不是命令本身,而是团队对 lock 文件的认知偏差:它不是“缓存”,而是**依赖快照**——删了它,等于删掉了部署一致性契约。










