应用型项目必须提交 composer.lock 文件,否则不同环境依赖版本不一致会导致 Class not found 等故障;它记录精确版本、源类型、校验值等,确保可重现构建;库项目则不应提交。

composer.lock 必须提交到 Git,不是可选项
应用型项目(比如 Laravel 网站、Symfony API、WordPress 插件后台服务)的 composer.lock 文件必须提交,否则你和同事、CI 流水线、生产服务器安装的依赖大概率不一致——这不是“可能”,而是每天都在发生的事实。
常见错误现象:
本地 composer install 成功,CI 报 Class not found;测试环境通过,生产部署后突然抛 Method does not exist;git pull 后队友执行 composer install,vendor 目录里多出十几个新文件、少掉几个旧类。
根本原因只有一个:lock 文件没进 Git,或者被 .gitignore 误删了。
验证方式:git check-ignore -v composer.lock —— 如果有输出,说明它被忽略了,立刻从 .gitignore 里删掉对应行。
为什么不能只靠 composer.json 约束版本
composer.json 里的 "monolog/monolog": "^2.0" 是范围约束,不是精确指令。它允许 Composer 在 2.0.0 到 2.999.999 之间任选一个“最新兼容版”。不同时间、不同机器上跑 composer install(没有 lock 文件时),结果可能分别是 2.5.1、2.8.0、2.10.2 —— 它们都合法,但行为可能不同。
composer.lock 记录的是:每个包的精确版本号、源类型(dist/git)、commit hash、zip 下载地址、SHA256 校验值,甚至当前平台信息(如 php: 8.2.12、ext-intl: * )。这些共同构成一次可重现的依赖快照。
所以:
• composer install → 读 lock,装锁定版本
• composer update → 忽略 lock,重新解析依赖树,生成新 lock
CI/CD 流水线里如果用了 composer update 而非 composer install,等于主动放弃构建一致性。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
什么时候该运行 composer update 并提交新 lock
不是“想升级就 update”,而是明确需要变更依赖策略时才触发。比如:
• composer audit 提示某个包含高危漏洞,且修复版已在约束范围内
• PHP 升级到 8.3,需让 Composer 重新评估扩展兼容性(此时建议加 --with-all-dependencies)
• 引入新功能,必须用 symfony/console v6.4+ 的某个 API
实操建议:
• 升级单个包:用 composer update vendor/package-name,避免连带更新其他包
• 提交前务必执行 git diff composer.lock,重点看 content-hash、各包的 version 和 source 字段是否符合预期
• 若本地 PHP 版本与目标环境不一致(例如本地是 8.2,生产是 8.1),应在 composer.json 中声明 "config": {"platform": {"php": "8.1.0"}},否则 composer update 可能选到不兼容的包版本
容易被忽略的关键细节
composer.lock 不只是“版本列表”,它参与依赖解析本身。比如你在本地 PHP 8.2 上运行 composer update,lock 文件会记录 "platform": {"php": "8.2.12"};之后别人在 PHP 8.1 上执行 composer install,即使 lock 文件完全一样,也可能失败——因为某些包在 lock 生成时已排除了 8.1 兼容版本。
所以:
• 库项目(如你写的 SDK、组件包)不要提交 composer.lock,它的依赖应由下游决定
• 应用项目必须提交,且 CI/CD 配置里要确保 composer install --no-interaction 而非 update
• composer install --dry-run 是上线前快速校验 vendor 是否与 lock 匹配的有效手段,不一致会直接报错
最常被跳过的一步:改完 composer.json、跑完 composer update,却忘了 git add composer.lock。只要漏掉这一行,前面所有操作就归零。

















