Composer不支持通过配置直接排除文件或目录在install/update时写入,exclude-from-classmap仅影响autoload_classmap.php生成,不干预文件系统;真正剔除需用scripts钩子清理或源头配置archive.exclude。

Composer 本身不支持通过配置直接排除文件或目录(比如测试数据、fixtures、.env.example 等)在 composer install 或 composer update 后写入 vendor 或项目根目录。 所有“exclude files”类需求,实际都得靠外部机制配合 Composer 生命周期来实现,否则容易误删、漏删,甚至破坏包的可复现性。
为什么 composer.json 的 exclude-from-classmap 不管用
这个配置只影响自动加载器(vendor/autoload.php)生成时跳过某些路径,它完全不干预文件是否被下载、解压或复制到磁盘上。哪怕你把 "tests/": "exclude-from-classmap" 写进去,tests/ 目录依然会完整出现在 vendor/some/package/tests/ 里。
- 它只改
vendor/composer/autoload_classmap.php,不碰文件系统 - 对非 PSR-0/4 的资源(如 JSON fixtures、SQL dumps、.md 文档)完全无效
- 第三方包若在
install阶段执行脚本(如post-install-cmd),这些文件可能已被主动读取或处理过
真正可行的剔除方式:用 scripts + rm / find
利用 Composer 的脚本钩子,在安装完成后手动清理。这是目前最可控、最透明的做法,尤其适合 CI 环境或部署前裁剪体积。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在
composer.json的"scripts"中添加:"post-install-cmd": [ "find vendor/ -name 'tests' -type d -prune -exec rm -rf {} +", "find vendor/ -name 'fixtures' -type d -prune -exec rm -rf {} +", "find vendor/ -name '*.md' -type f -delete" ] - 注意顺序:
post-install-cmd在vendor/已解压完成之后运行;post-update-cmd可同步加一份 - Linux/macOS 下
find ... -delete更快,但 Windows 需换用 PowerShell 或forfiles,否则会报错 - 别用
rm -rf vendor/**/tests—— shell glob 在不同环境展开行为不一致,find更可靠
更安全的替代方案:用 composer archive + 自定义打包逻辑
如果你控制着被依赖的包(比如公司内部私有包),可以在源头规避——让 composer archive 生成的 ZIP 不含测试数据,而不是靠下游清理。
- 在该包的
composer.json中配置:"archive": { "exclude": ["/tests", "/fixtures", "/.env.example", "/CHANGELOG.md"] } - 然后运行
composer archive打包上传到私有仓库(如 Satis 或 Packagist private) - 下游
composer install拉下来的 ZIP 就天然不含这些路径,无需额外清理 - 注意:
archive.exclude是 Composer 2.2+ 特性,且仅作用于 ZIP 包构建,不影响git安装源
真正难的不是“怎么删”,而是判断哪些文件能删、删了会不会影响运行时行为。比如有些包把 stubs/ 当作代码生成模板,examples/ 里藏着必须加载的配置片段——这类路径不能无差别匹配删除。建议先用 composer show -s vendor/package 看源码地址,再人工确认目录用途,比盲目 exclude 更稳妥。

















