<p>Composer无内置命令显示包体积,必须用du -sh vendor/* | sort -hr | head -20(Linux/macOS)或PowerShell脚本(Windows)统计,或安装baethon/composer-packages-size插件;vendor/composer和vendor/bin非第三方包,不应作为优化目标,真正需关注tests/docs等非运行时目录及--no-dev策略。</p>

Composer 没有内置命令能直接显示每个包占了多少磁盘空间,所有“查体积”的需求都得靠外部工具或系统命令配合实现——别在 composer show 或 composer outdated 里浪费时间找大小字段。
用 du -sh vendor/* 快速定位大包(Linux/macOS)
这是最轻量、无需安装任何额外依赖的方法,适合快速排查。关键不是看单个文件,而是统计整个包目录的总占用:
-
du -sh vendor/* | sort -hr | head -20:按人类可读格式倒序排,取前 20 名 - 注意
vendor/*可能漏掉带点号的目录(如vendor/.cache),但正常 Composer 安装不会产生这类路径 - 如果某包目录是符号链接(比如指向全局 cache),
du默认不跟随,结果会偏小;加-L参数可强制展开,但要小心重复计数 - 执行后发现
vendor/composer异常大?大概率是autoload_classmap.php或installed.json膨胀,这属于 autoload 机制产物,和包体积无关,不用删
Windows 下用 PowerShell 替代 du
PowerShell 没有原生 du,但可用以下命令等效实现:
Get-ChildItem vendor -Directory | ForEach-Object { [PSCustomObject]@{Name=$_.Name; Size=(Get-ChildItem $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum} } | Sort-Object Size -Descending | Select-Object -First 20 Name, @{Name="SizeMB";Expression={[math]::Round($_.Size / 1MB, 2)}}注意几点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 加
-File参数避免把目录本身当文件统计,否则Size会为 null - 若遇到权限错误导致中断,可在
Get-ChildItem后加-ErrorAction SilentlyContinue - 不跟随符号链接(PowerShell 默认行为),所以如果用了 Composer cache-dir 且被复用,结果可能低估真实磁盘占用
- 别信
Name和composer show --installed的输出完全一致——有些包在 vendor 下的目录名含 vendor 前缀(如vendor-vendorname/pkg),得手动核对
用 baethon/composer-packages-size 插件省事
如果你不想拼命令、又想跨平台统一处理,这个插件是目前最稳的选择(支持 Composer 2.x):
- 全局安装:
composer global require baethon/composer-packages-size - 项目内运行:
composer packages-size,它会扫描vendor/下每个合法包目录并求和 - 它统计的是解压后的实际磁盘占用,不是 zip 包下载大小
- 不处理
vendor/bin/下的 PHAR 文件(如phpunit),因为那些不属于“包目录”范畴;但你可以在结果里看到phpunit/phpunit本体大小 - 插件不会帮你删东西,也不会跳过
tests/或docs/—— 它只忠实反映当前vendor/里有什么、占多大
为什么单看体积没意义?重点盯三类干扰项
一个包显示 80MB,未必代表它“臃肿”。真正影响部署和加载的,往往是这些混进去的非运行时内容:
-
tests/、Tests/、examples/目录:很多包(如symfony/console)把完整测试套件打包进 dist,生产环境完全不需要 -
.git目录:说明这个包是用 source 方式安装的(比如指定了"type": "package"或禁用了 dist),整份 Git 历史都被拉下来了 -
node_modules/或二进制资源:前端工具链类包(如laravel-mix)或带预编译 Chromium 的包(如spatie/browsershot)会悄悄塞进大量非 PHP 文件 - 别被
vendor/bin/迷惑:里面大多是软链接,不占额外空间;但像laravel/installer这种会复制完整 PHAR 进来,就得单独算
真正要优化,得先分清“体积大”是因为包本身设计如此,还是因为部署流程没清理干净——后者更容易动手,也更安全。

















