Composer 不支持 install/update 时跳过下载包中的特定文件,vendor 中残留的 tests/ 等需由包作者在发布时用 archive.exclude 排除,或用户通过 post-install-cmd 脚本手动清理。

Composer 本身不支持在 install 或 update 过程中跳过已下载包里的特定文件或文件夹。你看到的 vendor/ 里残留的 tests/、docs/、.git/,不是 Composer “没排除”,而是它压根就没这个能力——排除动作必须由包作者在发布阶段完成,或由你在安装后手动清理。
为什么 archive.exclude 对你 composer install 没用
这个配置只在包作者执行 composer archive 或 Packagist 自动打包时生效,控制的是「该包最终发布的 ZIP/TAR 包里不包含哪些路径」。它:
- 不作用于你本地的
composer install命令 - 不能写在你自己项目的
composer.json里去影响第三方包 - 路径必须以
/开头(如"/tests/"),不支持**或正则 - 改完后必须打新 tag(如
v2.1.0)才可能被下游用户用上
想删 vendor 里某个包的 tests/?用 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" ]
del /s /q 权限失败或路径空格问题php scripts/clean-vendor.php 更可靠vendor/ 是只读的,rm -rf 可能静默失败
exclude-from-classmap 不是删文件,只是不进自动加载表
如果你的目标是“不让测试类被自动加载”,而不是“删掉测试文件”,这个字段才适用:
- 必须写在
autoload或autoload-dev块内,例如:
"autoload": {
"psr-4": { "App\": "src/" },
"exclude-from-classmap": ["/tests/", "/benchmarks/"]
}
PSR-4 加载逻辑——只要类在 src/ 下且命名空间匹配,照样能 new 出来composer dump-autoload -o 才生效tests/ 却发现类还能加载,大概率是因为它同时被 autoload-dev.files 或其他 PSR-4 映射兜底了真正容易被忽略的一点:你无法靠改自己项目的任何配置,去改变别人发布的包里有什么文件。能控制源头的只有包作者;能做补救的只有你自己——要么说服对方加 archive.exclude,要么在安装后立刻清理,没有第三条路。

















