composer.lock 是带哈希校验的依赖快照,非操作日志;它锁定具体版本、源码commit及dist校验值,确保可重复安装;必须提交至Git,CI应始终用install而非update;误删后须从git恢复而非重建。

composer.lock 文件不是日志,是依赖快照
它是一份带哈希校验的、可完全复现的依赖状态快照,不是记录“谁什么时候装了什么”的操作日志。一旦存在 composer.lock,composer install 就不会重新解析版本约束,而是严格按里面写的 "monolog/monolog": "2.9.1"、"source": "git"、"dist": { "sha256": "..." } 安装——连源码 commit 和压缩包校验值都锁死了。
- 删掉
composer.lock后跑composer install,等于没执行任何安装,只会报错提示“找不到 lock 文件” - 真正等价于重算依赖的是
composer update,它会重新走一遍依赖求解器,可能拉下guzzlehttp/guzzle7.2.0(触发已修复的 DNS 缓存 bug)或升上monolog/monolog3.0.0(导致 handler 接口不兼容) -
composer.lock里还分packages和packages-dev,composer install --no-dev只装前者,这点在 CI 构建时必须对齐
为什么必须提交到 Git?不是“建议”,是强制要求
应用项目(非 library)的 composer.lock 不提交,等于把环境一致性交给运气。Git 提交记录里如果出现 composer.lock 被删又重建,基本意味着某次发布已经埋下隐患——你无法回溯当时线上跑的是哪套依赖组合。
- CI/CD 流水线应始终用
composer install,而非composer update;否则每次构建都可能拿到不同小版本,破坏可重复构建 - 本地开发引入新包时才该运行
composer update,且升级后必须立刻git add composer.lock && git commit,让变更可见、可审、可回滚 - 安全扫描工具(如 phpstan-security 或 SCA 工具)依赖
composer.lock做基线比对;文件缺失或被篡改,告警直接失效
删了 lock 文件怎么办?别重跑 install,要恢复快照
误删 composer.lock 后执行 composer install 是无效操作;想“重建”它,本质是重抽一次依赖签,风险极高。正确做法是把它当丢失的生产配置来对待——从最近一次有效 commit 恢复。
- 先查历史:
git log -n 5 --oneline -- composer.lock,找到最后正常上线那次的 commit - 恢复文件:
git checkout <commit-hash> -- composer.lock - 再执行:
composer install—— 这才能还原出和上次发布完全一致的依赖树 - 若已合入错误的 lock 并推送到远端,需
git revert对应 commit,而不是手动改 lock 再 commit
lock 文件本身不需要“导出备份”,但要管好它的生命周期
composer.lock 就是最权威的依赖备份,它自带完整版本、哈希、依赖树结构,无需额外导出 zip 或生成 lock.bak。真正要管的是它的版本演进路径。
- 给重大发布打 tag 时,确保对应 commit 包含当时有效的
composer.lock,这是事后排查问题的唯一可信依据 - 分支策略中,
main分支的composer.lock应始终代表线上稳定态;develop分支允许更新,但每次 merge 回main必须经过完整验证 - 不要在 CI 脚本里加
rm composer.lock && composer install这类操作——这等于主动放弃一致性保障
复杂点在于:它看起来只是一份 JSON,但实际承载着整个项目的依赖契约。改它,就等于改了部署契约;忽略它,就等于默认接受所有未知变更。


















