Composer不支持全局忽略,跳过文件夹仅因未注册或显式排除:PSR-4只扫描autoload.ps r-4中定义的路径;exclude-from-classmap仅对classmap生效;archive.excludes仅影响打包,与自动加载无关。

Composer 生成自动加载映射时跳过某些文件夹,不是因为“主动忽略”,而是因为这些路径根本没被纳入 autoload 扫描范围,或被显式排除在 classmap 构建之外——它不支持全局 ignore 逻辑,所有“跳过”都依赖明确配置。
psr-4/psr-0 不会扫描未注册的目录
PSR-4 自动加载只响应 autoload.ps r-4(注意 JSON 中需写为 "App\")里明确定义的命名空间前缀和路径映射。未出现在该字段中的任何目录(如 tests/、docs/、bin/),Composer 完全不会去扫描,更不会生成映射。
- 常见错误:把
tests/放进ps r-4映射,结果测试类被误加载进生产环境 —— 这违反了隔离原则,应改用autoload-dev.ps r-4 - 正确做法:只注册业务代码路径,比如
"App\": "src/";测试代码路径仅出现在autoload-dev段 - 注意:
ps r-4路径必须存在且可读,否则composer dump-autoload不报错但映射为空
exclude-from-classmap 只对 classmap 生效
exclude-from-classmap 是唯一能“排除”文件的配置项,但它只影响 classmap 类型的自动加载,对 PSR-4 完全无感。它只在你显式声明了 autoload.classmap 时才起作用。
- 如果你项目只用
ps r-4,加"exclude-from-classmap": ["tests/"]是无效的 - 生效前提:必须同时有
"classmap": ["src/", "legacy/"]这类配置 - 路径是相对于项目根目录的,推荐加尾部
/避免误排除同名文件(如test目录 vstest.php) - 通配符
*支持,但不支持**;例如"build/*"✅,"**/*.log"❌
archive.excludes 和 autoload 完全无关
archive.excludes 只控制 composer archive 打包时剔除哪些文件,不影响 install、update、dump-autoload 的任何行为。把它当成“忽略 autoload”的方案,属于典型误用。
- 常见误操作:在
archive.excludes里加"tests/",以为能减少 autoload 冲突 —— 实际上 autoload 仍会扫描它(只要它在 psr-4/classmap 路径内) - 真实用途:精简发布的 zip 包体积,比如排除
.env、docker-compose.override.yml、日志文件等 - 支持
**和更丰富的 glob 模式,但路径始终相对于项目根目录,不是 vendor
手动删 vendor 子目录只会引发一致性问题
有人发现 vendor/some/package/tests/ 占空间大,就直接 rm -rf,结果下次 composer update 恢复,或 autoload 错乱。这不是 Composer “没忽略”,而是你绕过了它的完整性校验机制。
- vendor 下的每个子目录由包作者定义,Composer 不生成它们,只下载并校验
- 删了
tests/不影响 autoload(除非该包把它注册进了自己的autoload),但可能破坏composer install --dry-run校验或导致 hash 不匹配 - 真正可控的精简方式只有两个:
composer install --no-dev(跳过 require-dev 包及其 tests/),或推动上游包作者在自己的archive.excludes里加排除规则
最关键的混淆点在于:Composer 没有“忽略”概念,只有“未注册”和“显式排除”。想让某个目录不出现在 autoload 映射里,最干净的做法永远是——别把它写进 autoload 或 autoload-dev;其次才是用 exclude-from-classmap 补救。任何试图靠删除、注释、或滥用 archive.excludes 来“绕过”的操作,都会在后续更新或跨环境部署时暴露问题。


















