composer本身不提供依赖体积分析功能,需结合du命令统计vendor目录下各包大小,并注意排除tests/docs等非运行时文件及优化autoload机制。

Composer 本身不提供依赖体积分析功能
直接运行 composer install 或 composer update 不会输出任何包大小信息。Composer 的职责是依赖解析与安装,它不扫描文件系统、不计算磁盘占用,也不缓存或暴露每个包的体积数据。想靠 composer show、composer outdated 或插件机制(如 composer-unused)查体积,都会失败——这些命令只处理元数据(版本、描述、require 列表),和实际文件大小无关。
用 du + composer show --installed --no-ansi 快速估算 vendor 下各包体积
最轻量、无需额外工具的方法:先获取已安装包列表,再逐个统计对应目录大小。注意路径需严格匹配 vendor/ 下的实际结构(例如 monolog/monolog 对应目录是 vendor/monolog/monolog,不是 vendor/monolog)。
执行以下命令(Linux/macOS):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer show --installed --no-ansi | grep -E '^[a-z0-9\-]+/[a-z0-9\-]+' | cut -d' ' -f1 | while read pkg; do echo "$(du -sh vendor/$pkg 2>/dev/null | cut -f1) $pkg"; done | sort -hr | head -20
-
composer show --installed --no-ansi输出纯文本包列表,避免 ANSI 颜色干扰解析 -
grep -E '^[a-z0-9\-]+/[a-z0-9\-]+'过滤出合法的 vendor/name 格式行(跳过空行、扩展名、版本号等杂项) -
du -sh vendor/$pkg统计目录总大小;2>/dev/null忽略因符号链接或权限缺失导致的报错 -
sort -hr按人类可读格式逆序排序,head -20只看前 20 大
警惕 vendor/bin、tests、docs 等非运行时目录带来的虚高
很多包(如 phpunit/phpunit、symfony/console)把测试用例、文档、二进制脚本全塞进发行包里,这些在生产环境完全不需要。单纯看 du -sh vendor/xxx 会严重高估真实体积。
- 检查是否启用了 Composer 的
remove-dev和optimize-autoloader:它们不影响vendor/目录大小,但能减少运行时加载开销 - 用
composer install --no-dev安装后重跑du命令,排除require-dev包干扰 - 手动进入大包目录,运行
du -sh */ | sort -hr查看子目录分布,快速识别tests/、resources/、examples/是否占主导 - 某些包支持
composer install --prefer-dist --no-scripts跳过 post-install-cmd,防止生成额外缓存或构建产物
真正要优化体积?别只盯着单个包,重点看 autoloader 和 classmap
PHP 应用启动慢、内存占用高,往往不是因为某个包“太大”,而是自动加载器反复 stat 大量小文件。一个 5MB 的包如果含 2000 个 PHP 文件,比一个 15MB 但只有 50 个类的包更伤性能。
- 运行
composer dump-autoload --optimize --classmap-authoritative强制生成完整 classmap,避免运行时遍历psr-4目录 - 检查
composer.json中是否误将autoload设为psr-0或未限制命名空间前缀,导致扫描范围过大 - 用
composer show --tree看依赖树深度,深层嵌套可能引入重复或废弃包(比如两个组件各自 require 不同版本的guzzlehttp/promises) - 某些包(如
ramsey/uuid)提供ramsey/uuid-doctrine这类精简版,专为减少依赖而设计,替换前先确认功能覆盖度
体积分析只是起点,真正卡点常藏在 autoload 行为和依赖拓扑里。别让 du 结果把你带偏了方向。










