composer install 不会更新 lock 文件是设计使然;它仅按 lock 文件还原 vendor/,不读取 composer.json 的版本约束,仅当 lock 缺失或哈希不匹配时才报错;改非依赖字段需用 composer update --lock-only(2.2+)安全刷新 content-hash 等元数据。

composer install 不会更新 lock 文件,这是设计使然
很多人改完 composer.json(比如加了个 "description" 或调了空格),再跑 composer install,发现 composer.lock 没变,还被提示 “Lock file is not up to date”——这不是 bug,是预期行为。composer install 的唯一职责是按 lock 文件精确还原 vendor/,它根本不读 composer.json 的版本约束,更不会重算或刷新 lock。
- 只有
composer.lock缺失或内容哈希不匹配时,composer install才会报错退出,逼你手动干预 - 如果你只是改了非依赖字段(如
license、type、注释),lock 文件里对应的content-hash就会失效,必须显式刷新 - 误用
composer update来“同步”这种修改,会导致所有包按新约束重算,极可能升到意料之外的版本
只更新 lock 文件,用 composer update --lock-only
这是 Composer 2.2+ 引入的唯一安全方式:它读取当前 composer.json 全部内容(包括新增/修改的 require 字段),验证已安装的包是否仍满足所有约束,然后仅重写 composer.lock 中的 content-hash、排序、格式和元数据,不碰 vendor/ 一丁点。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 适用场景:改了
composer.json但不想升级任何包;Git 合并后 lock 哈希失效;CI 流水线需要校验 lock 合法性 - 旧版本 Composer(
- 执行前建议加
--dry-run:运行composer update --dry-run --lock-only,看输出是否只列出了哈希或格式变更,而不是一堆包版本变动
composer update --lock 是另一回事:它不管 composer.json
这个命令常被误认为是 --lock-only 的替代品,其实完全相反:composer update --lock 会忽略 composer.json 的任何改动,只对当前 vendor/ 目录做快照,重新计算每个包的 dist hash、源地址、依赖树结构,并标准化写回 lock 文件——哪怕你在 json 里新加了一个包,它也当没看见。
- 典型用途:修复因 Git 自动换行、手动编辑导致的 lock 文件损坏;统一团队中 lock 的 JSON 格式(缩进、字段顺序)
- 它不校验
composer.json和已安装包是否兼容,所以不能解决 “JSON 改了但 lock 没同步” 的问题 - 如果
vendor/已损坏或部分缺失,此命令会失败;它要求 vendor 必须完整且可解析
想升级某个包?别碰 --lock-only,用 composer update vendor/package
--lock-only 从不改变包版本,它只刷新 lock 文件。真要升级包,必须走 composer update 的正路,但得精准控制范围,否则整个依赖树都会漂移。
- 只升一个包:运行
composer update monolog/monolog,Composer 会保留其他所有包的 lock 版本,仅按其约束更新该包及必要子依赖 - 升多个包:直接列出,如
composer update guzzlehttp/guzzle symfony/console - 注意隐式升级:如果目标包的子依赖在
composer.json中未显式声明,但其自身composer.json放宽了约束(比如"psr/http-client": "^1.0"),它们也可能被顺带升级 - 加
--with-all-dependencies会主动升级全部传递依赖,容易引发冲突,上线前务必先--dry-run
composer.json 的动机,而不是“看起来像同步”。










