composer install必须读composer.lock,因其设计目标是“还原”而非“决策”,只按lock中写死的版本、dist URL和SHA256校验值安装,完全忽略composer.json中的^/~约束;缺失时会退化为隐式update,导致依赖不一致、构建失败等严重问题。

composer install 为什么必须读 composer.lock
因为 composer install 的设计目标就是“还原”,不是“决策”。它完全不解析 composer.json 里的 ^2.0、~1.2.3 这类版本约束,只认 composer.lock 里写死的 version、dist.url 和 sha256 校验值。没这个文件,命令直接失败(v2.5+ 报 Command "install" is not defined),旧版可能静默装错包。
composer.lock 缺失时会发生什么
不是“重装一遍而已”,而是交出全部控制权:Composer 会退化为隐式执行 composer update,重新计算整个依赖树。结果不可控,典型表现包括:
-
monolog/monolog从2.10.2升到3.0.0,触发接口不兼容 -
guzzlehttp/guzzle因 PHP 版本限制被降级,复现已知 DNS bug - CI 构建报
Class 'Symfony\Component\HttpClient\HttpClient' not found,但本地能跑 - 安全扫描基线失效,SCA 工具无法比对历史快照
git 合并冲突时别手动改 composer.lock
composer.lock 是整个依赖图的完整序列化快照,不是普通配置文件。手动删几行、保留“这边的”或“那边的”字段,大概率导致安装失败或依赖不一致。正确做法是:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
git checkout --ours composer.lock或git checkout --theirs composer.lock任选其一恢复 - 删掉
vendor/目录确保干净 - 运行
composer install—— 它会基于当前composer.json和刚恢复的 lock 重新校验并生成一份新 lock - 如果提示
Your lock file does not contain a compatible set of packages,说明composer.json已被他人修改,先git pull,再composer install
哪些场景必须运行 composer update 并提交新 lock
composer.lock 只对影响依赖解析逻辑的变更敏感。以下修改后必须执行 composer update 并提交新 lock:
- 在
composer.json中增删或修改require/require-dev包 - 调整 PHP 版本约束(如把
"php": "^8.1"改成"^8.2") - 修改
platform配置(如锁定扩展版本)
改了就不管,会导致本地能跑、CI 报错或行为漂移——尤其是当团队有人漏提交 lock 文件时,问题往往在部署后才暴露。

















