exclude-from-classmap仅对classmap生效,不影响psr-4加载;它只在显式配置"classmap"时起作用,需配合dump-autoload使用,路径相对项目根目录且支持*通配符。

exclude-from-classmap 只对 classmap 生效,别指望它拦住 PSR-4 类
这个配置项常被误当成“全局排除开关”,其实它只在你显式启用了 classmap 自动加载时才起作用。如果你的 composer.json 里只有 "psr-4": {"App\": "src/"},那加 exclude-from-classmap 基本没反应。
常见错误现象:往 exclude-from-classmap 里写了 "tests/",但 TestsFooTest 还是能被自动加载——因为该类被 PSR-4 规则覆盖了,根本没走 classmap。
- 必须配合
"classmap": ["src/", "lib/"]这类显式声明才生效 - 路径是相对于
composer.json所在目录的,写"tests/"或"tests"都行,但推荐带末尾/避免匹配到test.php - 支持
*通配符(如"legacy/*"),Composer 2.2+ 起支持**递归匹配 - 改完必须运行
composer dump-autoload,否则vendor/composer/autoload_classmap.php不更新
想让 tests/ 目录彻底不出现在生产包里?靠 .gitattributes,不是 composer.json
很多人在 composer.json 里加 "archive": {"exclude": ["/tests"]},结果 GitHub 点 Download ZIP 还是把 tests/ 打进去了——因为 GitHub、GitLab 默认用 git archive 打包,只认 .gitattributes,不读 composer.json 的 archive 字段。
真正生效的写法是在项目根目录建 .gitattributes,内容为:
/tests export-ignore /Tests export-ignore /phpunit.xml export-ignore /phpunit.xml.dist export-ignore
-
export-ignore是 Git 原生命令,所有基于git archive的分发行为(Packagist、GitHub Releases、composer archive)都遵守 - 路径开头不加
/会变成模糊匹配(比如tests会误删mytests.php),务必加 - 这个配置对
composer install完全无影响,只控制「别人下载你的包时看到什么」
autoload-dev 不是排除机制,而是开发环境开关
autoload-dev 里的规则(比如 "psr-4": {"Tests": "tests/"})不会让 tests/ 在生产环境“消失”,它只决定:当 composer install --no-dev 时,这些命名空间是否注册进自动加载器。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
文件本身依然存在——只要它们是项目源码的一部分(比如你自己的 tests/ 目录),就会被完整复制进部署目录。
-
composer install --no-dev只跳过require-dev里的包,不删你项目根目录下的tests/ - 若想让
tests/不进部署包,必须用.gitattributes或archive.exclude(后者仅对 Packagist 发布有效) - 如果你发现
--no-dev后tests/还在,说明它不是通过依赖引入的,而是你自己的源码目录
别手动删 vendor 里的 tests/,也别指望 exclude-from-classmap 能减小 vendor 体积
exclude-from-classmap 只影响 autoload_classmap.php 的大小,不影响 vendor/ 目录实际占用空间。而 vendor/some/package/tests/ 这类目录,是由上游包作者控制的,你本地改 composer.json 根本无效。
常见误操作:看到 vendor/monolog/monolog/tests/ 太大,就 rm -rf vendor/*/tests——下次 composer update 全恢复,还可能触发校验失败。
- 精简
vendor/的唯一可靠方式是composer install --no-dev,这能跳过所有require-dev包(包括它们自带的tests/) - 真要剔除某个依赖里的测试目录,只能联系包作者,在其
.gitattributes里加export-ignore -
archive.exclude对你自己项目的vendor/安装过程零影响,它只管“你作为包作者发布时打包什么”
最易被忽略的一点:排除逻辑分三层——自动加载(autoload)、安装时下载(--no-dev)、发布时打包(.gitattributes / archive)——混用或错配配置,基本都会失效。










