Composer无全局排除开关,“排除”本质是未声明即不加载;autoload.exclude仅5.0+支持且只作用于PSR-4/PSR-0,路径须相对composer.json、不支持通配符;exclude-from-classmap仅对classmap生效,需显式配置classmap并运行dump-autoload;autoload-dev仅控制环境加载注册,不删除文件;彻底排除生产包中文件应使用.gitattributes的export-ignore。

Composer 没有全局“排除文件”的开关,所谓“排除”,本质是控制哪些路径被声明进 autoload —— 没声明的,自然不加载;声明了但想筛掉,得看类型选对配置项。
autoload.exclude 只在 Composer 5.0+ 有效,且仅限 PSR-4/PSR-0
这个字段常被误以为是通用排除机制,其实它只对 psr-4 和 psr-0 生效,完全不管 classmap 或 files。
- 检查版本:
composer --version,低于5.0.0写了也白写 - 路径必须相对
composer.json,比如想排除tests/Stub/,就得写"tests/Stub/"(末尾斜杠推荐加) - 不支持通配符:
"tests/**/*.php"或"*.test.php"都无效,只能写具体目录或文件路径 - 改完必须运行
composer dump-autoload,否则 vendor/autoload.php 不更新
exclude-from-classmap 只对 classmap 生效,别指望它拦 PSR-4 类
如果你的 composer.json 里只有 "psr-4": {"App\": "src/"},那加 exclude-from-classmap 基本没反应 —— 它压根不参与 PSR-4 加载流程。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须显式声明
classmap,例如:"classmap": ["src/", "lib/"] -
exclude-from-classmap路径也相对项目根,支持*(如"legacy/*"),Composer 2.2+ 起支持**递归匹配 - 常见错误:写了
"tests/"却发现TestsFooTest还能加载 —— 因为它走的是 PSR-4 映射,根本没进 classmap 表 - 改完同样要
composer dump-autoload,否则vendor/composer/autoload_classmap.php不变
autoload-dev 不是排除,而是环境隔离
autoload-dev 里的规则(比如 "App\Tests\": "tests/")不会让 tests/ 在生产环境“消失”,它只决定:当运行 composer install --no-dev 时,这些命名空间是否注册进自动加载器。
-
--no-dev不删文件,只跳过autoload-dev的加载注册 - 如果
tests/同时被psr-4主映射覆盖(如"App\": "src/"包含了src/Tests/),那它照样被加载 - 真正安全的做法是:把测试类挪到独立目录(如
tests/),并只在autoload-dev中映射,主autoload里完全不提它 - 混在
src/里的测试类最难处理 —— 此时exclude-from-classmap是唯一能从 classmap 表里剔除它们的手段
想让文件彻底不出现在生产包里?靠 .gitattributes,不是 composer.json
archive.exclude 只影响 composer archive 或 Packagist 构建的分发包,对 composer install 完全无感;而 GitHub/GitLab 的 Download ZIP 默认用 git archive 打包,只认 .gitattributes。
- 在项目根目录建
.gitattributes,内容如:/tests export-ignore - 路径开头必须加
/,否则tests会误删mytests.php -
export-ignore是 Git 原生命令,所有基于git archive的行为(Packagist、GitHub Releases、composer archive)都遵守 -
composer.json里的"archive": {"exclude": ["/tests"]}对 GitHub 手动下载 ZIP 无效
最容易被忽略的点:同一个文件可能被多个 autoload 机制兜底加载 —— 比如你用 exclude-from-classmap 排除了 tests/,但它又被 psr-4 主映射覆盖,或者被硬编码的 require 加载,那排除就形同虚设。排查时得逐层确认加载链,而不是只盯一个配置项。

















