autoload.exclude 仅 composer 5.0+ 支持,低版本无效;路径须相对 composer.json、仅作用于 psr-4/psr-0,不适用于 classmap 或 files;推荐改用 autoload-dev 实现环境隔离。

autoload.exclude 是 Composer 5.0+ 才支持的配置项
早于 Composer 5.0 的版本(比如常用但已过时的 2.x)根本不识别 autoload.exclude,强行写进去也不会报错,但完全无效。这是最常被忽略的前提——不是写法错了,是版本不支持。
检查当前版本:
composer --version必须是
Composer version 5.0.0 或更高。低于这个版本,得换思路(见下一条)。
用 exclude 排除文件时,路径是相对于 composer.json 的
比如项目结构是:
./composer.json<br>./src/Helper.php<br>./tests/Stub/ExampleStub.php想排除所有
Stub 文件,得这么写:
"autoload": {
"psr-4": { "App\": "src/" },
"exclude": ["tests/Stub/"]
}
注意:
-
exclude值是字符串数组,不是 glob 模式,不支持**或*.php - 路径末尾斜杠可选,但推荐加上,避免误匹配(比如
"tests/Stub"会同时匹配tests/Stub.php和tests/Stub/) - 不能写绝对路径,也不能用
../回退
exclude 不影响 classmap 或 files 类型的加载
autoload.exclude 只对 psr-4 和 psr-0 生效。如果你在 autoload.classmap 里手动加了 tests/ 目录,或者用了 autoload.files 引入了某个 helper.php,exclude 完全管不了它们。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
常见误操作:
- 以为加了
"exclude": ["tests/"]就能阻止测试类被加载——结果classmap里还存着旧映射,vendor/autoload.php照样加载 - 改完
composer.json忘了运行composer dump-autoload,缓存没刷新,行为没变
更兼容的替代方案:用 autoload-dev + 单独的测试 autoloader
如果你要排除的是一整类文件(比如测试桩、示例代码、CLI 工具脚本),其实更适合挪到 autoload-dev 下,并确保生产环境不加载它:
"autoload": {
"psr-4": { "App\": "src/" }
},
"autoload-dev": {
"psr-4": { "App\Tests\": "tests/", "App\Stub\": "tests/Stub/" }
}
这样:
- 生产环境跑
composer install --no-dev,vendor/autoload.php根本不含Stub类 - 开发环境可以正常用,且 IDE 补全、静态分析也不受影响
- 不需要依赖
exclude,兼容所有 Composer 版本
真正难处理的是那种“混在 src 里、又不能重命名、还不能进 autoloader”的边角文件——这时候就得靠文件系统权限或构建脚本清理,autoload 机制本身不负责过滤“不该存在”的文件。










