核心原因是未清理dev依赖及冗余文件,而非安装过多;需结合--no-dev、--optimize-autoloader、archive.excludes配置与定向清理脚本,按需选用轻量替代方案并避免全家桶式引入。

Composer vendor 目录体积大,核心原因不是“装得多”,而是“没删干净”——dev 依赖、测试文件、文档、未启用的扩展、重复的 autoload 映射都在悄悄占空间。
composer install --no-dev 真的够用吗?
不够。它只跳过 require-dev 的包安装,但很多包(比如 phpunit、mockery)本身在生产环境根本不需要,而它们的 vendor/bin/、tests/、docs/、.github/ 甚至 examples/ 目录仍会完整保留。
实操建议:
- 部署前先运行
composer install --no-dev --optimize-autoloader,强制生成扁平化类映射,避免 runtime 扫描 - 检查
composer.json中是否误把phpunit放进了require(而非require-dev),这种错误非常常见 - 确认项目是否真需要
symfony/var-dumper或laravel/tinker这类调试工具——上线后它们纯属累赘
如何批量删除无用文件和目录?
靠人工删不现实,也容易误伤。推荐用 composer-cleaner 或自定义脚本,但更稳妥的是直接在 composer.json 中配置 archive.excludes(仅对 packagist 包生效)或使用 hirak/prestissimo 替换为更轻量的插件。
更通用且安全的做法是部署时加一步清理:
- 运行
find vendor/ -name "*.md" -o -name "*.txt" -o -name "README*" -o -name "CHANGELOG*" -delete - 删测试相关:
find vendor/ -path "*/tests" -o -path "*/Tests" -o -path "*/test" -o -path "*/Test" -type d -exec rm -rf {} + 2>/dev/null - 删 GitHub 元数据:
find vendor/ -name ".git" -type d -exec rm -rf {} + 2>/dev/null - 注意:不要删
vendor/autoload.php和vendor/composer/下的autoload_*.php,否则 autoloading 失效
为什么有些包体积特别大?怎么针对性处理?
典型大户: monolog/monolog(含大量 Handler 示例)、symfony/console(带完整命令行交互逻辑)、guzzlehttp/guzzle(含异步、桩测试、重试策略等全功能)。它们不是“臃肿”,而是默认打包了所有可选能力。
优化方向:
- 用
monolog/monolog替代monolog/monolog?不行——它是同一包。正确做法是:只use Monolog\Handler\StreamHandler;,不引入SocketHandler或SyslogHandler,PHP 自动加载机制天然按需加载,但前提是别在代码里use它们 - 替换 Guzzle:若只做简单 HTTP 请求,改用
ext-curl+ 原生封装,或轻量库如psr7-http-client - 警惕“全家桶”式包:比如
laravel/framework会拉下symfony/http-kernel等全套,若只是微服务 API,考虑迁移到lumen或纯 PSR-15 中间件栈
vendor 里还有隐藏空间杀手?
有。最常被忽略的是:vendor/composer/installed.json(通常几 MB)、vendor/composer/ClassLoader.php 的冗余映射、以及某些包自带的 build/、dist/、resources/ 目录。
进阶建议:
- 用
composer show --tree检查是否有循环依赖或重复版本(如symfony/polyfill-*被多个包各自 require) - 启用
"optimize-autoloader": true和"classmap-authoritative": true后,vendor/composer/autoload_classmap.php可替代全部 PSR-4 扫描,体积反而更小、加载更快 - CI/CD 中可在
composer install后执行composer dump-autoload --classmap-authoritative --no-dev --optimize,再压缩 vendor
真正省空间的关键不在“删多少”,而在“让 Composer 别装不该装的”——每次 composer require 前,先问一句:这个包的全部能力,我真用得上吗?











