composer install 默认不跳过测试文件和文档,需配置 archive.excludes 或用 composer-archive-excludes 插件在解压 zip 包时过滤 tests/docs 等路径,仅对 dist 安装生效;--no-dev 仅跳过 require-dev 包,不删其内部测试文件。

composer install 时跳过测试文件和文档
默认 composer install 会把所有 require-dev 依赖及其完整源码(含 tests/、docs/、examples/)一并拉下来,哪怕你只是跑生产环境。这不是 bug,是设计如此——因为开发依赖本身没做“裁剪”声明。
真正起作用的是 composer install --no-dev --optimize-autoloader,但注意:它只删 dev 依赖包,不删已安装包里的测试文件。
-
--no-dev:跳过require-dev区块的包(如phpunit、mockery),但不影响require包内部是否带tests/ -
--optimize-autoloader:生成扁平类映射,提升加载速度,和删文件无关 - 真正删包内冗余文件,得靠
composer config配置archive.excludes或用插件
用 composer-archive-excludes 插件精准过滤 vendor 中的 tests/docs
官方不提供“安装时自动剔除包内测试目录”的开关,但社区有稳定插件 hirak/prestissimo 已停更,推荐用 composer-archive-excludes ——它在解压 zip 包阶段就跳过匹配路径,比事后 rm -rf 更干净、可复现。
执行以下命令启用:
composer global require cweagans/composer-patches composer require --dev cweagans/composer-patches composer config archive.excludes '["tests", "Tests", "test", "Test", "docs", "Docs", "examples", "Examples", ".github", ".gitignore"]'
下次 composer install 或 composer update 就会自动忽略这些路径(仅对从 packagist 下载的 zip 包生效;git 克隆方式不受影响)。
- 该配置只影响新安装/更新的包,已有
vendor/不会自动清理 - 部分包(如
symfony/console)把测试放在src/外独立目录,这类能被有效过滤;但若测试混在src/里(极少见),无法区分 - 别加
vendor/到 excludes,会导致整个包被跳过
vendor 目录已膨胀?手动清理要避开的雷区
直接 find vendor -name tests -type d -exec rm -rf {} + 最快,但危险:有些包把核心功能放在 tests/ 下(比如旧版 monolog 的某些 handler 示例),删了会报 Class not found。
- 优先删明确无业务耦合的目录:
tests/、docs/、examples/、.github/、CHANGELOG.md(后者不是目录,但占空间) - 别碰
src/、lib/、bin/、resources/——哪怕名字像测试(如src/TestHelper.php)也不动 - 执行前先
git status确认vendor/没被 git 跟踪(应该没跟踪),否则清理后可能误提交空目录 - CI 构建机建议保留完整
vendor/,只在部署到线上服务器前清理
为什么 vendor 还是很大?检查 autoload 与 dist vs source
即使做了上述操作,vendor/ 仍可能超预期,常见原因有两个:
- 包作者没打 zip 包,而是用
"source"方式安装(即 git clone),此时archive.excludes完全无效,.git/目录本身就能占几 MB - 某些包的
autoload配置错误,比如把tests/加进psr-4映射,导致 autoloader 扫描它,你不删它反而影响性能
查来源:运行 composer show monolog/monolog,看 type: 是 library 还是 project,再结合 dist 和 source 字段判断安装方式。想强制走 dist,加 --prefer-dist 参数;但某些包(如私有 repo)只支持 source。
autoload 检查:打开 vendor/composer/autoload_psr4.php,搜 tests,如果发现类似 'Monolog\Tests\' => array($vendorDir . '/monolog/monolog/tests'),就得联系包作者改 composer.json,或 fork 后 patch。
真正省空间的关键,不是删得多,而是让 composer 别把不该装的东西装进来——配置得早,比清理得勤更重要。










