composer update --lock-only是唯一安全解法:它读取当前composer.json全部内容,验证已安装包是否仍满足约束,仅重写content-hash、字段顺序、json格式和平台元数据,完全不动vendor/。

想“只更新 lock 文件”却不动 vendor,不是用 composer update,而是用 composer update --lock-only(Composer 2.2+)或 composer update --lock(语义不同,需分清)——其他命令都会改包、升版本、甚至破坏一致性。
composer update --lock-only:改了 composer.json 非依赖字段后安全刷新 lock
你改了 composer.json 里的 description、license、config.platform.php 或加了注释,composer install 就会报 “Lock file is not up to date”,但你根本不想升级任何包。
-
--lock-only是唯一正解:它读取当前composer.json全部内容,验证已安装的包是否仍满足所有约束,仅重写composer.lock中的content-hash、字段顺序、缩进和元数据,vendor/ 完全不动 - 必须加
--dry-run预检:composer update --dry-run --lock-only。如果输出里出现大量包版本变更,说明你本地 vendor 已不满足新约束(比如 PHP 版本变了但旧包不兼容),不能硬刷 - 旧版 Composer 不支持
--lock-only,要么升级工具,要么只能接受composer update连带升级包的风险
composer update --lock:不装包、不联网、只同步 lock 格式与平台信息
这个命令常被误认为是 --lock-only 的替代,其实目标完全不同:它不管 composer.json 是否改动,只拿当前 vendor/ 目录做快照,重新生成一份结构合规、字段对齐的 composer.lock。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 适用场景:团队中
composer.lock换行符不一致、字段顺序混乱;或删了vendor/但想快速重建锁文件(前提是vendor/曾完整安装过) - 它不校验包内容完整性,也不检查
composer.json和 vendor 是否匹配 —— 如果你手动删过某个包,它不会报错,但后续composer install可能失败 - 若
composer.json里写了非法 platform(如"php": ">=8.1 "多了个空格),--lock会直接报错退出,而不是忽略
为什么 composer install 有时也改了 composer.lock?
composer install 本不该动 composer.lock,但以下三种情况会触发自动重写:
-
composer.json和composer.lock的content-hash不匹配(比如你手动编辑过 json 但没同步 lock)——install 会强制重写 lock 来对齐 hash -
composer.lock里记录的 PHP 版本(platform段)和当前环境不一致,且启用了config.platform.php覆盖,Composer 会重写 lock 中的platform字段 - 用了
--no-scripts或--no-plugins,导致某些插件(如旧版hirak/prestissimo)无法执行初始化逻辑,间接触发 lock 重生成
验证方法:composer install --dry-run。如果输出含 “would update lock file”,就说明上面某条被触发了。
别用 composer update 去“修复” lock 文件差异
常见错误:Git 提示 composer.lock 被修改,你没运行 update,却以为是“漏同步”,于是执行 composer update 想“对齐”——结果生成带新时间戳、新哈希、新子依赖版本的 lock,引发不必要的合并冲突。
- 真正该做的是
composer install:它严格按 lock 文件安装,不查 packagist,不重算依赖树,也不会升级包 - 如果
composer.lock是别人提交的,而你本地vendor/缺失或不一致,install会自动补全,且 lock 不变 - 误用
update的后果是:依赖漂移、CI 构建不可重现、上线后行为突变 —— 真正麻烦的从来不是命令敲得对不对,而是 lock 里那些没显式声明却实际生效的间接依赖










