Composer 不会自动清理测试文件等冗余内容,推荐使用 eloquent/composer-cleaner 插件或自定义 post-install-cmd 脚本实现安装后自动清理,避免误删核心文件。

Composer 本身不会自动删除测试文件、文档或开发用资源,但可以通过配置 composer.json 中的 archive 和 installer-paths 相关机制,配合插件或脚本,在安装/更新后清理冗余内容。最常用且可靠的方式是使用 composer-cleaner 或更轻量的 scripts + post-autoload-dump 钩子。
启用 Composer 的 archive 配置(适用于包作者)
如果你是包的维护者,可以在自己的 composer.json 中定义哪些路径不参与打包(比如发布到 Packagist 时):
- 添加
"archive": {"exclude": ["/tests/", "/Tests/", "phpunit.xml", "README.md", ".gitignore"]} - 该配置只影响
composer archive命令或 Packagist 自动生成的 ZIP 包,不影响本地composer install - 对项目依赖的“安装后清理”无直接作用,但能减少远程包体积
在项目中自动清理已安装包的冗余文件
推荐使用 eloquent/composer-cleaner 插件,它专为这个场景设计:
- 运行
composer require --dev eloquent/composer-cleaner - 默认会删掉
tests/、Tests/、docs/、.travis.yml、phpunit.xml等常见开发文件 - 支持自定义规则:在
composer.json加入"extra": {"cleaner": {"exclude": ["/examples/", "/benchmarks/"]}} - 安装/更新后自动触发,无需额外命令
用 post-install-cmd 脚本手动清理(轻量替代方案)
不引入插件时,可写一个简单 shell 脚本配合 Composer 钩子:
- 创建
bin/clean-vendor.sh,内容如:find vendor/ -name "tests" -type d -prune -exec rm -rf {} + 2>/dev/nullfind vendor/ -name "*.md" -path "vendor/*/*" -delete 2>/dev/null - 在
composer.json中添加:"scripts": {"post-install-cmd": ["sh bin/clean-vendor.sh"], "post-update-cmd": ["sh bin/clean-vendor.sh"]} - 注意:Windows 用户需改用 PowerShell 或
robocopy替代方案,或用跨平台工具如rm -rf(通过 Git Bash 或 WSL)
注意事项和常见误区
有些做法看似合理但实际有风险:
- 不要盲目删
vendor/autoload.php或composer.lock相关文件——它们是运行必需的 - 避免在
post-autoload-dump中清理,因为此时 autoloader 尚未完全生成,可能误删正在扫描的目录 - CI/CD 环境中建议保留测试文件(如 GitHub Actions 运行单元测试),清理仅用于生产部署
- 某些包(如 Laravel 的
framework)自带laravel/framework的优化安装逻辑,无需额外清理
基本上就这些。用 composer-cleaner 是最省心的选择;若追求极简,手写脚本也够用。关键是别动核心结构,只清明确无用的开发附属内容。










