composer.lock 是依赖快照的唯一权威依据,必须提交至 Git;导出精确清单用 composer show --locked --format=txt > deps-locked.txt,不加 --dev 仅含生产依赖,加则包含 require-dev 包。

composer install 之前必须先有 composer.lock,否则导出的 composer.json 依赖清单不精确,根本没法还原环境。
导出精确依赖清单用 composer show --locked --format=txt
这是最可靠的方式,直接读取 composer.lock 输出所有已解析的包名、版本、来源和哈希值,不含 dev 依赖(除非加 --dev)。
- 不加
--dev:只导出生产依赖,适合部署时校验 - 加
--dev:包含require-dev包,适合本地开发备份 - 输出是纯文本,可直接重定向到文件:
composer show --locked --format=txt > deps-locked.txt - 注意:该命令在没有
composer.lock的项目里会报错Could not find package ... in lock file
composer.json 不能直接当依赖清单用
它只声明“想要什么”,不是“实际装了什么”。比如你写 "monolog/monolog": "^2.0",实际可能装的是 2.10.0,甚至因依赖冲突降级为 2.9.2 —— 这些信息全在 composer.lock 里。
-
composer.json缺少版本锁定,composer install在不同机器上可能装出不同结果 - 想从
composer.json生成近似清单?可以用composer show --no-dev --format=json | jq -r '.packages[] | "\(.name) \(.version)"',但仍是估算,不推荐用于备份 - CI/CD 环境若只传
composer.json不传composer.lock,等于放弃依赖一致性
备份时别漏掉 composer.lock 文件本身
它才是真正的“快照”,比任何 txt 导出都权威。txt 只是人眼可读的副产品,lock 文件才是 composer 重建环境的唯一依据。
- Git 提交时必须包含
composer.lock(除非是库项目且明确不锁定) - 导出 txt 是为了审计、比对或人工检查,不是替代 lock 文件
- 如果项目用了
platform-check或自定义platform配置,composer show --locked输出会反映这些约束,但 txt 里不会说明原因 —— 需要结合composer config platform查看
真正关键的不是 txt 文件长什么样,而是你有没有在每次 composer update 后提交新的 composer.lock。没 lock,所有导出都是纸上谈兵。










