不能。composer show 只显示包名、版本、描述和依赖关系,不包含磁盘占用信息;需用 du 命令手动统计 vendor 下各包体积,如 cd vendor && du -sh */ | sort -hr | head -20。

composer show 能不能直接看到包体积
不能。composer show 只显示包名、版本、描述和依赖关系,不包含磁盘占用信息。它读的是 composer.lock 和 vendor/ 目录元数据,但不会扫描文件系统大小。
用 du 命令手动统计 vendor 下各包体积
最直接有效的方式是结合 du(disk usage)定位大包。注意必须进到 vendor/ 目录下操作,否则路径不准:
cd vendor du -sh */ | sort -hr | head -20
常见要点:
-
-s表示汇总每个目录总大小,-h以 KB/MB/GB 显示,-r是倒序(最大在前) - 部分包含子命名空间(如
symfony/console),会出现在symfony/目录下,所以只看一级目录会漏掉它们;可改用du -sh */* | sort -hr查二级 - 某些包含大量测试或文档(如
phpunit/phpunit),实际运行时并不需要,可考虑用--no-dev安装或后期清理
为什么 vendor/bin 和 vendor/composer 占空间却不属于“包”
vendor/bin 是软链接集合,本身几乎不占空间;真正吃空间的是 vendor/composer/autoload_*.php 和 vendor/composer/installed.json 等缓存文件——它们体积小,但所有包的类映射都集中在这里。真正影响体积的永远是包自身的 src/、tests/、docs/ 和 vendor/ 嵌套依赖(比如一个包自带 node_modules)。
容易被忽略的一点:composer install --no-dev 不仅跳过 require-dev,还会阻止 dev 包的自动加载注册,但已下载的 dev 包文件仍留在 vendor/ 中——必须删掉后重装才真正减体。
有没有更轻量的自动化统计方式
可以写一行 shell 快速生成带排序的 CSV 报表:
du -sk vendor/* 2>/dev/null | sort -nr | awk '{printf "%s\t%s\n", $1, $2}' | sed 's/vendor\///' | head -15说明:
-
du -sk用 KB 单位,避免小数,便于后续数值排序 -
2>/dev/null屏蔽权限错误(如某些 .git 目录不可读) -
awk调换字段顺序,让大小在前、包名在后,方便人眼扫视 - 结果不含嵌套子包(如
monolog/monolog),如需完整覆盖,得遍历find vendor -maxdepth 2 -type d -name composer.json -exec dirname {} \;再逐个 du
真正的难点不在命令怎么写,而在于区分「必要代码」和「附带产物」——比如 laravel/framework 里 resources/ 下的 stub 文件、doctrine/orm 里的 SQL 方言测试数据,这些都不会被加载,却占几 MB。删之前务必确认是否被项目脚本引用。










