composer show --locked 才是正确起点,它解析 composer.lock 输出精确版本、来源及 commit hash;加 -f json 可导出结构化数据,--no-dev 可排除开发依赖,但不可替代 composer.lock 用于部署。

composer show 能列出所有已安装包,但不带版本锁信息
直接运行 composer show 会显示当前项目中所有已安装的包及其最新稳定版,但它读的是 vendor/composer/installed.json 的运行时快照,**不反映 composer.lock 中锁定的实际版本**——比如你本地装了 monolog/monolog v2.10.0,但 lock 文件里锁的是 v2.9.1,show 就会给你错觉。
真正需要“导出安装包列表”用于备份或审计时,目标其实是还原可复现的依赖状态。所以核心不是“看现在有什么”,而是“锁文件里记了什么”。
-
composer show --locked才是正确起点:它解析composer.lock,输出每个包的精确版本、来源(dist / source)、commit hash(如果是 VCS 包) - 加
-f json可转成结构化数据:composer show --locked -f json > dependencies-locked.json - 如果只要纯文本清单(如给运维或 CI 使用),用
composer show --locked --no-ansi | grep '^[a-z0-9\-]/[a-z0-9\-]'过滤掉标题和空行,再awk '{print $1"="$2}'拼成vendor/package=1.2.3格式
用 composer.lock 做版本记录比手动维护更可靠
composer.lock 不是临时文件,它是 Composer 的权威依赖快照。只要它存在且未被修改,composer install 就能 100% 复现相同依赖树——包括嵌套依赖的版本、下载源、校验和。
很多人误以为“只要 composer.json 不变,依赖就稳定”,其实不然:
- 如果没提交
composer.lock到 Git,不同人composer install会各自解析最新兼容版本,结果可能不同 - 即使
composer.json锁定了"guzzlehttp/guzzle": "^7.2",没有lock文件时,某天^7.2可能解析出 7.8.0,而另一天是 7.7.1 -
lock文件还记录了platform信息(PHP、ext-* 版本),这对跨环境部署至关重要
导出时绕不开的几个坑
导出依赖清单常踩的坑,基本都来自混淆“声明”“安装”“锁定”三层语义:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
别用
composer list:它只列 Composer 自带命令,和项目依赖完全无关 -
别依赖
vendor/autoload.php动态反射:有些包在autoload里注册了类但没实际安装(比如require-dev未启用时),结果漏报或误报 -
区分
--dev和无参行为:默认composer show --locked包含require-dev的包;若只需生产环境依赖,加--no-dev参数 -
Git 提交前检查
composer.lock是否更新:执行composer update后忘记git add composer.lock,会导致别人拉代码后install出错或版本漂移
CI/CD 或离线部署时的轻量替代方案
如果只是想快速生成一个供人工核对的文本清单(比如发给客户确认版本),不需要完整 lock 文件,可以这样压缩输出:
composer show --locked --no-dev --format=plain | sed -n '/^[a-z]/s/ .*$//p' | sort > deps-production.txt
这行命令干了四件事:只读锁定状态、排除 dev 包、用纯文本格式、去掉版本号后面冗余信息、排序后保存。生成的 deps-production.txt 是干净的 vendor/package 列表,适合粘贴进文档或邮件。
但注意:这种简化清单不能替代 composer.lock 用于部署——它丢了版本号、哈希、平台约束等关键字段,无法保证一致性。
真正要存档或交接,composer.lock 本身才是唯一可信的“版本记录”,其余都是它的投影或摘要。










