最安全有效的 vendor 目录瘦身方案是组合使用 --no-dev、--prefer-dist 和 --remove-vcs 重建 vendor,并配合 archive.excludes 过滤 tests/docs 等目录,再启用 --classmap-authoritative 强制类加载器依赖静态映射。

vendor 目录体积大,不是因为装了太多包,而是默认保留了大量运行时完全不需要的文件——tests/、docs/、.git、examples/、translations/,甚至某些包的 bin/ 脚本和语言资源。直接 rm -rf 这些目录风险极高,极易触发 Class not found 错误。
用 --no-dev + --prefer-dist + --remove-vcs 重建 vendor
这是最安全、见效最快、CI 友好的组合,适用于部署或本地重装:
-
--no-dev:跳过require-dev中所有包(如phpunit、phpstan),省下几百 MB;注意检查是否误把sebastian/environment或symfony/var-dumper放在require-dev里,它们可能被运行时间接依赖 -
--prefer-dist:强制下载 zip 包而非 git clone;dist 包通常已剔除tests/、docs/、.github/等目录 -
--remove-vcs:兜底清理——有些 dist 包仍混着.git目录,这个参数会在解压后自动删掉
必须用 composer install(不是 update),且需先 rm -rf vendor 再执行。否则已有文件不会被裁剪。
配 archive.excludes 在解压阶段过滤 tests/docs
--no-dev 和 --prefer-dist 解决不了包内部的 tests/ 目录——因为这些路径是作者打包进 zip 的。要真删,得在 unzip 阶段跳过:
- 先安装插件:
composer require --dev composer-archive-excludes - 在
composer.json的config.archive.excludes下加过滤项:["/tests/", "/docs/", "/examples/", "/.github/", "/CHANGELOG.md"] - 之后每次
composer install或composer update,匹配路径在解压时就被跳过,不会落地
⚠️ 别用 find vendor -name tests -type d -exec rm -rf {} +:旧版 monolog/monolog 把 StreamHandler 示例放 tests/ 下,删了就挂。
启用 --classmap-authoritative 关闭文件扫描
这步不减体积,但让前面所有瘦身真正生效——否则即使删了 tests/,autoloader 仍可能因 scandir() 失败而报错,尤其在容器、NFS 或只读文件系统中:
- 确保
"optimize-autoloader": true已写入composer.json的config块 - 运行:
composer dump-autoload --optimize --classmap-authoritative --no-dev - 后续
composer install --no-dev --optimize-autoloader --classmap-authoritative会重建vendor并只保留autoload_classmap.php里声明的路径
它强制 autoloader 完全依赖静态映射,彻底绕过文件系统遍历。没有它,瘦身只是“看起来小”。
删语言包和 translations/ 要按包精细控制
很多包(如 symfony/console、laravel/framework)自带多语言 translations/ 或 resources/lang/,占体积常超 20%,但硬删 /translations/ 可能漏掉或误删——因为不同包存放位置不统一:
-
monolog/monolog把翻译逻辑放在src/Monolog/Translator.php,不带独立目录 -
doctrine/dbal把帮助文本放lib/Doctrine/DBAL/Tools/Console/Helper/里 - 推荐用
composer-cleaner,在extra.cleaner.exclude中按包名声明排除规则,例如:"monolog/monolog": ["/src/Monolog/Translator.php"]
别指望一次配置通杀所有包;真正安全的裁剪,永远建立在确认 autoload 不依赖该路径的基础上。











