<p>Composer自身不提供依赖体积分析,需用du -sh vendor/* | sort -hr定位大包(Linux/macOS),Windows推荐WSL2或Git Bash,插件baethon/composer-packages-size可跨平台简化操作,真正影响体积的是测试、文档等非运行时文件。</p>

Composer 本身不提供依赖体积分析能力,所有“查大小”的需求都得靠外部命令或插件——别在 composer show 或 composer outdated 里找体积字段,它们只读元数据,不扫描文件系统。
用 du -sh vendor/* | sort -hr 快速看总体分布(Linux/macOS)
这是最直接、无依赖、结果最准的方式,适合快速定位谁吃掉了磁盘:
-
du -sh vendor/*统计每个一级子目录(即每个包)的总占用,-h输出 MB/GB 单位,-s跳过逐项打印 -
sort -hr按人类可读格式倒序排,最大值在最前;加| head -20只看前 20 名,避免刷屏 - 常见错误:写成
du -sh vendor,结果只显示vendor目录自身(通常几 MB),漏掉所有子包 - 某些包如
symfony/symfony是单目录多组件结构,vendor/symfony/下还有十几个子目录,仅查一级会低估——可补查:du -sh vendor/symfony/*/ 2>/dev/null | sort -hr | head -10
Windows 下用 PowerShell 替代 du(不推荐硬刚原生命令)
PowerShell 没有原生 du,Get-ChildItem + Measure-Object 虽能跑通,但慢、易中断、单位是字节需换算,且对符号链接处理不一致:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 基础命令:
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 Name, @{Name="SizeMB";Expression={[math]::Round($_.Size / 1MB, 2)}} - 必须加
-File参数,否则Measure-Object会对目录对象报错 - 遇到权限错误会中断,建议加
-ErrorAction SilentlyContinue - 更务实的做法:装 WSL2(推荐 Ubuntu)或 Git Bash,直接跑
du -sh vendor/* | sort -hr | head -20
用 baethon/composer-packages-size 插件省事(跨平台统一)
它本质是对 du 的封装,但解决了路径解析和排序问题,适合不想拼命令的场景:
- 全局安装:
composer global require baethon/composer-packages-size - 项目内运行:
composer packages-size,自动扫描vendor/下每个包的实际磁盘占用,并按降序排列 - 注意:它统计的是解压后全部文件(含
tests/、.github/、CHANGELOG.md),和你手动du结果一致,没额外信息 - 不支持排除路径(比如忽略所有
*.md文件),而find + du组合可以做到 - CI 或容器中若未预装该插件,
composer packages-size命令不可用,需提前处理
真正影响体积的不是包名,而是目录里的非运行时内容
看到某个包占几百 MB,大概率不是代码本身大,而是混进了不该在生产环境存在的东西:
- 测试用例、fixtures、demo 页面被打包进
dist/或examples/目录(如symfony/symfony的完整源码包) - PHP 扩展的二进制预编译文件(如
ext-protobuf相关包附带的.so或.dll) - 文档生成工具链(
phpdocumentor、roave/better-reflection)把大量缓存或 AST 数据写进vendor/子目录 -
vendor/bin下的二进制工具(如phpunit)通常只是软链,不占额外空间;但某些包(如laravel/installer)会把完整 PHAR 复制进来 -
vendor/composer和vendor/bin不是第三方包,不应作为优化目标——前者是 autoload 产物,后者是软链接集合
别只盯着单个包大小排序,先确认是否启用了 --no-dev 和 --optimize-autoloader;再手动进大包目录执行 du -sh */ | sort -hr,一眼就能看出 tests/、docs/、resources/ 是否占主导——这才是真正该裁剪的地方。

















