composer show --locked是导出精确依赖清单的唯一可靠命令,它直接读取composer.lock文件,输出所有已安装包(含嵌套依赖)、精确版本、来源类型及哈希值,不依赖vendor目录完整性。

composer show --locked 是导出精确依赖清单的唯一可靠命令
它直接读取 composer.lock,输出当前实际安装的所有包(含嵌套依赖)、精确版本、来源类型(dist/source)和哈希值,不依赖 vendor 目录是否完整。不加 --dev 默认只导出生产依赖;加则包含 require-dev 包。
常见错误现象:composer show 不带 --locked 时读取的是 vendor/ 实际文件结构,若有人手动删过子目录、或 vendor/ 损坏,结果就不可信;而 composer.json 只声明约束,根本不是“装了什么”的答案。
-
composer show --locked --no-dev --format=txt > deps-prod.txt:适合人工审计,一行一包,含版本与 dist URL -
composer show --locked --format=json > deps-full.json:适合脚本解析,字段稳定(.name、.version、.dist.shasum等) - 旧版 Composer(--locked,需先确保已运行
composer install,再执行composer show --format=json
导出纯包名列表(无版本)用 composer show --name-only
这个命令不查 lock、不读 vendor,只从 composer.json 的 require 和 require-dev 字段提取包名,一行一个,无空行、无版本、无描述——干净利落,适合比对项目间依赖差异或提交给安全团队做白名单核验。
使用场景明确:迁移前快速确认“用了哪些第三方包”,不关心具体版本;或者写 CI 脚本检查是否意外引入了某类敏感组件(如含 debug 或 test 字样的包)。
-
composer show --name-only:列出全部(含 dev) -
composer show --name-only --no-dev:仅生产依赖,更贴近上线环境 - 别用
composer show --tree | cut -d' ' -f1 | sort -u这类管道拼凑——会漏掉间接依赖,且格式不稳定
备份依赖状态 ≠ 导出文本,真正可还原的只有 composer.lock 文件本身
composer.lock 不是“配置快照”,而是可执行的安装说明书:它记录每个包的 exact version、dist zip URL、shasum 校验值、PHP 平台要求、甚至 post-install-cmd 执行逻辑。所有文本导出(.txt、.json)都只是它的只读副产品,不能反向驱动 composer install。
容易踩的坑:有人删了 composer.lock 后跑 composer update 想“恢复”,结果装了一堆新版,项目直接报错;还有人只备份 composer.json,CI 构建时因没 lock 文件,不同时间拉到的 minor 版本不一致,引发偶发故障。
- 备份动作就是复制
composer.lock,建议按日期命名:composer.lock.20260508 - 备份前务必检查
git status,确保该文件未被本地修改(即 clean),否则导出的是脏状态 - 若项目用了
config.platform(如强制"php": "8.1.10"),得一并记下,还原时 PHP 版本不匹配会导致composer install拒绝执行
迁移新服务器时,别碰 vendor/ 目录
直接复制 vendor/ 看似省事,实则埋雷:autoloader 里有路径硬编码、bin 脚本头行指向旧 PHP 路径、某些扩展包(如 ext-gd 相关)在安装时做了平台相关编译,换环境大概率 Class not found 或 failed to open stream。
正确还原流程极其简单:把 composer.json 和 composer.lock 丢到新机器 → 运行 composer install --no-dev。Composer 会严格按 lock 文件里的 shasum 下载、校验、解压,结果和原环境完全一致。
- 新服务器必须提前装好对应 PHP 版本及必要扩展(
mbstring、xml、zip、openssl),否则composer install会静默失败 - 私有仓库需提前配置 auth:
composer config -g http-basic.example.com token user - 内存不足时报错?用
php -d memory_limit=-1 $(which composer) install绕过限制
真正关键的不是导出成什么格式,而是你有没有在每次 composer update 后立刻 git add composer.lock && git commit。没这一步,所有导出都是镜花水月。











