要导出生产环境最小依赖的顶层包名,需同时满足排除开发依赖和仅取直接声明包两个条件,应使用composer show --name-only --direct --no-dev命令,它输出纯包名列表,适合管道处理或保存为文件。

它只输出包名,不带版本、描述或格式化空格,适合管道处理或写入文件。 但默认行为会包含 require-dev 中的包,且列出的是所有已安装包(含传递依赖),不是仅你 composer.json 里直接写的那些 —— 这点很多人误以为是“顶层依赖”,其实不是。
怎么只导出生产环境用到的顶层包名
要真正匹配上线部署所需的最小依赖集合,得同时满足两个条件:排除开发依赖 + 只取直接声明的包。
- 用
composer show --name-only --direct --no-dev——--direct是关键,它过滤掉所有传递依赖(比如monolog/monolog依赖的psr/log就不会出现) - 必须在项目根目录执行,否则报错
No composer.json found - 如果想保存成文件供后续比对,加重定向:
composer show --name-only --direct --no-dev > production-packages.txt
为什么 composer show --name-only 默认会包含 dev 包和传递依赖
因为 composer show 底层读的是 vendor/composer/installed.json,这个文件记录了 vendor/ 下每一个已解压的包,不管它来自 require、require-dev 还是某个包的子依赖。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不加
--direct:连symfony/polyfill-php81这种被其他包拉进来的补丁包也会列出来 - 不加
--no-dev:像phpunit/phpunit或laravel/pint这类只在本地跑测试/检查的工具全在列表里 - 大小写敏感:
guzzlehttp/guzzle和GuzzleHttp/Guzzle被视为不同包,命令输错就查不到
如何快速验证某个包是否属于直接依赖
别靠肉眼扫 composer.json,用 composer show 自带的 -I(installed)标志配合包名确认是否已装,再结合 --direct 判断层级:
- 先查是否装了:
composer show -I monolog/monolog→ 返回monolog/monolog表示已安装 - 再查是不是直接依赖:
composer show --direct | grep monolog/monolog→ 有输出才是顶层声明的 - 注意:
composer show --direct本身不支持--name-only组合(会报错),所以得用grep或findstr过滤
最易忽略的一点:composer show --name-only 在 Composer 2.5+ 才原生支持,旧版本只能靠 composer show | cut -d' ' -f1(Linux/macOS)或 PowerShell 替代方案,而且 cut 遇到带空格的包描述会截断错误 —— 直接升级 Composer 更省事。

















