Composer 无内置命令查包体积,推荐用 du -sh vendor/* | sort -hr | head -20 快速定位大包,或安装 baethon/composer-packages-size 插件自动统计;注意排除 tests/、二进制、.git 等非运行时内容。

Composer 本身不提供任何命令查看每个包的磁盘大小,composer show、composer show -s、composer show --installed 全都不返回体积数据——它们只读元信息,不扫描文件系统。
用 du -sh vendor/* 快速列出所有包目录大小(Linux/macOS)
这是最轻量、无依赖、秒出结果的方式,适合 CI 流水线或日常排查:
-
du -sh vendor/*统计每个一级子目录(即vendor/monolog/monolog、vendor/symfony/console)的总占用 - 加
| sort -hr | head -20可按大小倒序取前 20 名,一眼定位“吃空间大户” - 注意:部分包(如
symfony/symfony)会安装在vendor/symfony/下多个子目录,只查一级会漏掉;需补查du -sh vendor/symfony/* - 若结果偏小,可能因符号链接未展开,可加
-L参数(但通常不建议——vendor/bin的软链本就不该计入项目体积) - 若看到
vendor/composer异常大,大概率是autoload_classmap.php或缓存文件膨胀,而非包本身问题
用 baethon/composer-packages-size 插件自动统计(推荐长期使用)
这是目前兼容性最好、专为体积分析设计的 Composer 插件,支持 Composer 2.x:
- 全局安装:
composer global require baethon/composer-packages-size - 项目根目录下直接运行:
composer packages-size,它会遍历vendor/下每个包并汇总实际磁盘占用 - 插件统计的是解压后真实占用,不是 ZIP 下载体积,也不跳过
tests/或docs/—— 这反而是优点:帮你暴露哪些包把非运行时内容一起打了进来 - 不依赖系统命令,Windows 用户也能用;但要注意插件不会自动过滤
--no-dev包,统计前建议先composer install --no-dev - 它不处理嵌套依赖(比如某个包自带
node_modules),那部分仍算在父包名下,需手动进目录再du -sh */拆解
为什么有些包显示几百 MB?重点看这三类干扰项
看到 laravel/framework 占 120MB 或 spatie/browsershot 占 350MB,别急着删——大概率不是 PHP 代码本身大:
-
tests/、examples/、resources/、stubs/目录被一并打包进来,这些在生产环境完全不需要 - 预编译二进制:如 Chromium(
browsershot)、PDF 引擎(setasign/fpdf)、Protobuf.so文件,单个就上百 MB -
.git目录残留:某些包没切 dist,Composer 下载的是完整 Git 仓库(含历史提交),du -sh vendor/xxx/.git就能验证 - 误装前端工具:如
laravel-mix被当 PHP 包装进vendor/,实际它该走 npm;这类包往往自带node_modules,ls -la vendor/xxx一眼可见 -
vendor/bin里是软链,几乎不占空间;但像laravel/installer这类会复制 PHAR 到vendor/bin/laravel,得单独算
清理前必须确认的两件事
盲目删 vendor/xxx 很容易导致 Class not found 或自动加载失败:
- 先查它是否在
require-dev里:如果是phpunit/phpunit,确保没被其他包通过require间接拉入(用composer depends phpunit/phpunit验证) - 删完后必须运行
composer dump-autoload,否则旧的 classmap 仍指向已删除路径 - 不要手动删
vendor/autoload.php或改vendor/composer/autoload_*.php—— 这些是 Composer 自动维护的,破坏后整个 autoloader 失效 - 真正省空间的不是删包,而是用
.gitattributes在安装时裁剪:在包源码中配置tests/ export-ignore,Composer--prefer-dist会尊重它;但前提是包作者写了这个文件
最易被忽略的点:du 统计的是“当前 vendor 目录下的实际占用”,而生产部署镜像应基于 composer install --no-dev --optimize-autoloader 后的结果。本地开发环境看到的大包,很可能在 CI 构建阶段已被过滤或替换——别拿开发机的 du 输出直接指导线上容量规划。


















