composer install 只读 composer.lock 是为复现已知可靠状态,它严格按 lock 文件安装精确版本,无视 composer.json 的改动;若修改了 json 却未运行 update 或重生成 lock,会导致依赖不一致、包未安装等错误。

composer install 为什么只读 composer.lock 而不碰 composer.json
因为 composer install 的设计目标是复现**已知可靠的状态**,它完全信任 composer.lock 里记录的精确版本、哈希和依赖图。哪怕你改了 composer.json 里的 "monolog/monolog": "^2.0",只要没运行 composer update,install 就会无视这个改动,坚持装 lock 文件里写死的 2.9.1。
常见错误现象:composer install 后发现新加的包没装上、版本没更新、甚至报 Package xyz is not installed —— 八成是你改了 composer.json 却忘了跑 composer update 或删掉 composer.lock 重来。
- CI/CD 流水线必须用
install,确保所有环境部署的是同一组二进制兼容的包 - 本地开发想快速还原协作者的环境?
install比update快得多,跳过版本解析和冲突计算 - 如果 lock 文件缺失,
install会直接失败,不会退化成update行为
composer update 到底在“更新”什么
composer update 是唯一能**修改 composer.lock** 的命令。它重新读取 composer.json,按当前约束重新解析整个依赖树,下载新版本,并把结果写回 lock 文件。
容易踩的坑:composer update 默认更新**所有包**,哪怕你只改了一行 composer.json。这可能导致意外升级(比如 guzzlehttp/guzzle 从 7.4 跳到 8.0),引发运行时错误。
- 只更新某个包:用
composer update vendor/package-name,例如composer update doctrine/orm - 锁住大版本:在
composer.json中写"symfony/console": "5.4.*",比"^5.4"更明确,减少update时的跳跃风险 - 加
--with-all-dependencies才会递归更新子依赖;默认情况下,子依赖版本可能被父包硬性锁定,update不会动它们
lock 文件被修改但没提交,会发生什么
composer.lock 是协作关键文件,必须和 composer.json 一起提交到 Git。如果它被修改却没提交,其他开发者 git pull 后运行 composer install,就会装上和你本地**不一致**的依赖集合——轻则行为差异,重则 Class not found 或 Method not exists。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
典型场景:你在本地跑了 composer update foo/bar,lock 文件变了,但只提交了 composer.json 的小修改,忘了 push lock 文件。
- Git 预提交钩子可以检查
composer.lock是否脏(git status --porcelain composer.lock) - CI 脚本应校验
composer.lock是否与composer.json一致:composer install --dry-run成功才允许构建 - 不要在
.gitignore里忽略composer.lock—— 这是新手最常犯的致命错误
为什么有时候 update 后 lock 文件几乎没变
因为 Composer 的依赖解析器足够聪明:如果 composer.json 约束没放宽、远程包仓库也没发布新版本、且现有 lock 条目仍满足所有条件,update 就不会改动 lock 文件 —— 它只做必要更新,不是“强制刷新”。
这意味着你不能靠“有没有改 lock”来判断 update 是否生效。要确认是否真升级了,得看终端输出的 “Updating vendor/package (1.2.3 => 1.2.4)” 行,或对比 git diff composer.lock。
- 运行
composer show vendor/package查看当前安装版本 - 加
-v参数让update输出更详细:composer update -v vendor/package - 如果 lock 文件长期不动,可能是团队习惯性回避
update,导致安全补丁堆积 —— 这比 lock 文件变化本身更危险
锁文件不是“备份”,也不是“快照日志”,它是 Composer 依赖确定性的契约文本。任何绕过它的操作(比如手动编辑、rm 后 install、或只提交 json 不提交 lock),都在悄悄撕毁这份契约。










