composer install本身不支持运行时排除文件,因其仅下载完整dist包或source仓库;真正排除需靠源头控制(如.gitattributes或archive.exclude)、安装后清理(post-install-cmd脚本)或自动加载层过滤(exclude-from-classmap)。

composer install 命令本身不支持运行时排除任何文件或目录——它下载的是整个 dist 包或 source 仓库,没有 --exclude、--filter 或类似参数。你看到的 vendor 里残留的 tests/、docs/、.git/,不是 Composer “没排除”,而是它根本没这个能力。
为什么 composer install 无法跳过包内的文件
Composer 安装依赖时只做两件事:解析依赖关系、下载并解压包。它不扫描、不过滤、不解析包内文件结构。所谓“排除”,必须发生在更早或更晚的环节:
- 源头控制:包作者在发布 dist 包前,用
.gitattributes或archive.exclude剔除不需要的路径 - 安装后清理:你在
post-install-cmd脚本里手动删掉 vendor 下的特定子目录 - 自动加载层过滤:用
exclude-from-classmap阻止某些路径被写入 classmap(仅影响自动加载,不删文件)
试图在 install 过程中加 flag 实现排除,注定失败。运行 composer install --help 就能看到,它只接受 --no-dev、--ignore-platform-req 等有限选项,没有文件级过滤能力。
post-install-cmd 是最实际的清理方式
这是唯一能立刻见效、不依赖上游配合的方案,尤其适合部署环境精简体积:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在项目根目录
composer.json的"scripts"下添加: "post-install-cmd": ["rm -rf vendor/monolog/monolog/tests", "rm -rf vendor/monolog/monolog/examples"]- Windows 用户避免
del /s /q权限失败,统一用 PHP 脚本:"php scripts/clean-vendor.php" - 多个包要清理?别堆 shell 命令,写一个集中脚本更可靠、可调试、易维护
- 注意 CI 或容器环境里
vendor/可能是只读的,rm -rf会静默失败,建议加|| true或改用chmod +w预处理
exclude-from-classmap 只管自动加载,不管文件存在
它不是删除工具,而是 classmap 生成时的路径过滤器:
- 必须写在
autoload或autoload-dev块内,例如:"exclude-from-classmap": ["tests/", "docs/", "vendor/some/package/tests/"] - 路径是相对于项目根目录的,不以
/开头,不支持**(Composer 2.2+ 支持但需确认版本) - 只对
classmap类型生效,对 PSR-4 映射完全无效——哪怕你写了"App\": "src/",src/tests/下的类照样能被 new 出来 - 修改后必须运行
composer dump-autoload -o才更新vendor/composer/autoload_classmap.php - 常见误判:排除了
tests/却发现类还能加载,大概率是因为它同时被autoload-dev.files或其他 PSR-4 规则兜底了
真正想让文件不进 dist 包?得靠源头配置
如果你是包作者,或能推动第三方库维护者更新,才适用这些方式:
-
.gitattributes(推荐):在项目根目录加/tests export-ignore,Git 归档、GitHub ZIP 下载、Packagist dist 构建都会跳过 -
archive.exclude:写在composer.json根级,值为字符串数组,如["/tests", "/examples", "/phpunit.xml"];但它只在composer archive或 CI 打新 tag 时生效,改完不打 tag,下游用户根本用不上 -
archive.excludes(注意是复数):Composer 2.9+ 支持 glob 模式,如["**/*.log", "/.env"],但同样只作用于打包,不影响install行为
最后提醒一句:别手动 rm -rf vendor/*/tests。下次 composer update 会恢复,且可能破坏依赖完整性。所有“临时删文件”的操作,都该封装进脚本并绑定到 post-install-cmd 或 post-update-cmd,否则就是埋雷。










