composer本身不提供包体积统计命令,必须用du -sh vendor/* | sort -hr | head -20(linux/macos)或powershell对应命令(windows)直接读文件系统统计各包目录实际占用,插件存在符号链接、内存限制等缺陷,不可靠。

Composer 本身不提供任何统计包体积的命令,composer show、composer show -i、composer show -s 都不返回磁盘占用数据——这不是遗漏,是设计如此。真要查 vendor 里谁占空间最多,必须绕过 Composer,直接读文件系统。
用 du 查 vendor/* 各子目录实际占用(Linux/macOS)
这是最准、最快、零依赖的方式。关键不是看单个文件,而是统计每个包目录的总和:
-
du -sh vendor/* | sort -hr | head -20:列出前 20 大的包目录,-h可读,-r倒序,sort -hr能正确处理 1.2G、987M 这类混合单位 -
du -sh --apparent-size vendor/*:加--apparent-size可规避硬链接重复计数问题(比如多个包共用同一个vendor/composer/installed.json的硬链接) - 别用
du -sh vendor总览后就下结论——它可能漏掉符号链接目标或跳过深层嵌套,vendor/*展开才是真实分布 - 如果结果里出现
vendor/bin异常大,大概率是某 CLI 工具(如phpunit)带了完整依赖树,但它不属于“包体积”,只是可执行脚本的附带产物
Windows 用户用 PowerShell 替代 du
原生 cmd 不支持类 Unix 的磁盘统计逻辑,PowerShell 是唯一可行路径,但要注意两点:一是递归深度默认受限,二是不能自动处理符号链接。推荐命令:
Get-ChildItem vendor -Directory | ForEach-Object { [PSCustomObject]@{Name=$_.Name; Size=(Get-ChildItem $_.FullName -Recurse -File | Measure-Object Length -Sum).Sum} } | Sort-Object Size -Descending | Select-Object -First 20
说明:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须加
-File,否则Measure-Object会对目录对象报错 - 不统计空目录(如
tests/下没文件时),但实际中这类目录往往不占空间,不影响判断主因 - 如果某私有包目录下有
node_modules或.git,它会立刻浮现在 Top 20 里——这就是你要清理的靶子
为什么插件 baethon/composer-packages-size 不总是可靠
它确实能跑出类似 du 的排序结果,但底层仍是遍历 vendor/* 并调用 PHP 的 filesize() 和 scandir(),因此存在几个硬伤:
- 无法穿透符号链接:如果
vendor/some-package是指向/tmp/shared-pkg的 symlink,插件只算 symlink 文件本身(几字节),而du -L才会追踪进去 - 不区分
--no-dev状态:它统计的是当前vendor/全量,哪怕你刚运行过composer install --no-dev,它也不会自动过滤掉开发期才有的大包(如infection/infection) - PHP 内存限制容易爆:当某个包含数千个小文件(如
symfony/symfony的完整源码 dist),scandir()可能触发Allowed memory size exhausted - 它统计的是“解压后大小”,和
du一致,但别误以为这等于安装包下载体积——.zip经过压缩,实际网络传输小得多
看到某个包异常大,先别删,做三件事
几百 MB 的包,90% 不是代码本身大,而是混进了不该存在的东西。快速验证比盲目清理更安全:
- 进该包目录:
ls -la vendor/vendor-name/package-name,重点找:.git(说明用了--prefer-source)、node_modules、build/、dist/(某些前端库打包产物)、examples/或fixtures/ - 检查它是否被
require-dev拉入:运行composer depends vendor-name/package-name,如果输出为空,再查composer show -i | grep vendor-name/package-name看是否属于间接依赖链末端 - 确认 autoload 是否污染:运行
composer show vendor-name/package-name | grep autoload,如果看到"classmap": ["src/", "tests/", "examples/"],说明它的自动加载配置本身就带冗余目录,删包不如提 PR 或 fork 后修复
真正难的不是查出谁占空间,而是判断“这个大体积是否必要”——比如 spatie/browsershot 自带 Chromium 二进制,删了功能就废;而 phpunit/phpunit 在生产环境占 80MB 却完全无用,这种才该优先砍。工具只给数字,决策得靠人。










