exclude-from-classmap仅过滤classmap生成,不影响psr-4加载;须置于autoload内、路径相对项目根、末尾加/防误排除;生效需dump-autoload;测试类应移至autoload-dev并用--no-dev部署。

exclude-from-classmap 只影响 classmap 生成,不拦 PSR-4 加载
它不是“全局排除开关”,而是专用于 classmap 类型自动加载的过滤器。只要你的 composer.json 里没显式配置 "classmap": [...],加了 exclude-from-classmap 就完全没反应。
常见错误现象:tests/ 写进 exclude-from-classmap,但 TestsFooTest 还是能 new 出来——因为 PSR-4 加载器直接按命名空间去 tests/ 下找文件,根本没走 classmap。
-
exclude-from-classmap必须嵌套在autoload对象内,不能放在根级 - 路径是相对于项目根目录的,比如
"tests/"或"src/LegacyHelper.php" - 不支持
**或正则,"*.php"这类写法会被静默忽略 - 修改后必须运行
composer dump-autoload(或--optimize)才生效
想让测试类彻底不出现在生产环境?别靠 exclude-from-classmap
PSR-4 目录无法被“排除”,只能靠结构隔离。真正起效的做法是把测试代码全挪到 autoload-dev,并确保部署时加 --no-dev。
-
autoload块只放生产代码,例如"App\": "src/" -
autoload-dev块放测试映射,例如"Tests\": "tests/" - 执行
composer install --no-dev后,vendor/autoload.php里不会包含任何Tests\映射 - 验证方式:检查
vendor/composer/autoload_psr4.php是否还存在"Tests\"键
否则哪怕用了 exclude-from-classmap,PSR-4 加载器仍会在运行时扫描 tests/,造成磁盘 I/O 和潜在命名冲突。
什么时候该用 exclude-from-classmap?典型场景就这几个
它适合处理那些“存在但不该进 classmap”的零散文件或遗留目录,尤其是你主动启用了 classmap 自动加载时。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 项目根目录下非类文件,如
bootstrap.php、install.php -
src/里已废弃但暂时保留的辅助类,如src/LegacyHelper.php - 命令行工具脚本,它们不是标准类,也不该被 PSR 规则匹配
- 配合
composer dump-autoload --optimize使用:此时 PSR 映射也会被固化进 classmap,exclude-from-classmap才会对这些路径生效
注意:autoload.files 列表里的文件不受任何 exclude 控制——它们每次请求都会被无条件 require,删掉条目才是唯一办法。
容易被忽略的细节:路径结尾加 /,且 archive.excludes 完全无关
exclude-from-classmap 的路径末尾建议加 /,否则可能误排除同名文件。比如写 "test" 会同时跳过 test/ 目录和 test.php 文件。
另一个高频混淆点:archive.excludes 是打包用的,只影响 composer archive,对 install、update、autoload 全无效。把它当 autoload 排除手段,等于白配。
最稳妥的边界意识是:PSR-4 靠结构隔离,classmap 靠 exclude-from-classmap 精简,两者逻辑分离,混用只会埋坑。










