必须用composer update或其变体:全量重解析用composer update;仅同步content-hash用composer update --lock;局部更新指定包用composer update vendor/package。

composer install 不能更新 composer.lock 文件——它只读取 lock,从不修改它。
为什么 composer install 不会碰 composer.lock
它的设计目标就是“确定性安装”:只要 composer.lock 存在,就严格按里面记录的版本、哈希、依赖结构来装包,连一行 JSON 都不会动。哪怕你改了 composer.json 里的 "php": "^8.1",install 也照旧用 lock 里存的旧平台约束去校验和安装。
常见误解是删了 vendor/ 再跑 composer install 就算“重装+同步”,其实只是复原,lock 还是那个 lock。
想更新 lock 文件,该用哪个命令?
必须用 composer update 或它的变体:
-
composer update:全量重解析composer.json,生成新 lock(含所有包的新版本) -
composer update --lock:只重写 lock 文件,不装不卸不升级——适合你改了composer.json的非依赖字段(如config.platform),但想让 lock 的content-hash同步生效 -
composer update vendor/package:只更新指定包及其满足新约束的必要子依赖,lock 中其余部分保持不变
注意:--lock 参数在 Composer 2.2+ 才支持;旧版只能靠 composer update --dry-run 看影响,再决定是否真跑 update。
误以为 install 能更新 lock 的典型陷阱
这些操作都不会改变 lock:
- 删掉
vendor/后执行composer install - 加
--force-reinstall(它只强制重装,lock 不变) - 在 CI 脚本里写
composer install && composer install(第二遍直接跳过) - 手动编辑
composer.json后只跑install(会报错Your lock file does not contain a compatible set of packages)
报错不是让你“再试一次”,而是明确告诉你:json 和 lock 对不上,必须选一边——要么还原 json,要么运行 update 生成新 lock。
Git 合并后 lock 文件冲突,怎么安全更新?
绝不能手工合并或删行。正确流程是:
- 先用
git checkout --ours composer.lock或--theirs拿一个干净版本(推荐保留主干分支的 lock) - 删掉
vendor/目录 - 运行
composer install—— 如果失败,说明当前composer.json和选中的 lock 不兼容,此时才该运行composer update --lock或composer update
真正容易被忽略的是:composer.lock 的 content-hash 是整个 composer.json 的快照,哪怕只改了一个空格,hash 就变,install 就会拒绝执行。它不是配置文件,是不可手修的契约。


















