composer如何优化vendor目录大小_删除composer多余测试文件【技巧】

5次阅读

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

composer如何优化vendor目录大小_删除composer多余测试文件【技巧】

composer install 时跳过测试文件和文档

默认 composer install 会把所有 require-dev 依赖及其完整源码(含 tests/docs/examples/)一并拉下来,哪怕你只是跑生产环境。这不是 bug,是设计如此——因为开发依赖本身没做“裁剪”声明。

真正起作用的是 composer install --no-dev --optimize-autoloader,但注意:它只删 dev 依赖包,不删已安装包里的测试文件。

  • --no-dev:跳过 require-dev 区块的包(如 phpunitmockery),但不影响 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 installcomposer 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,再结合 distsource 字段判断安装方式。想强制走 dist,加 --prefer-dist 参数;但某些包(如私有 repo)只支持 source。

autoload 检查:打开 vendor/composer/autoload_psr4.php,搜 tests,如果发现类似 'MonologTests' => Array($vendorDir . '/monolog/monolog/tests'),就得联系包作者改 composer.json,或 fork 后 patch。

真正省空间的关键,不是删得多,而是让 composer 别把不该装的东西装进来——配置得早,比清理得勤更重要。

text=ZqhQzanResources