exclude-from-classmap仅影响classmap生成,不删除文件,须置于autoload或autoload-dev块内,路径相对根目录、区分大小写、不支持通配符,修改后需执行composer dump-autoload -o生效。

exclude-from-classmap 只对 classmap 生效,不是删除文件
这个配置不会删 vendor 里的任何东西,它只告诉 Composer:生成 autoload_classmap.php 时,跳过指定路径下的 PHP 文件。如果你希望类不被自动加载,但文件仍保留在磁盘上(比如测试桩、兼容层),这是唯一合规方式。
必须写在 autoload 或 autoload-dev 块内,不能放在顶层或 config 下:
{
"autoload": {
"classmap": ["src/"],
"exclude-from-classmap": ["src/Tests/", "src/Utils/LegacyHelper.php"]
}
}
- 路径是相对于项目根目录的,
"src/Tests/"末尾斜杠不能少,否则不匹配 - 不支持通配符(
*或**),只能写具体目录或文件名 - 仅影响
classmap类型加载;若同一类也通过psr-4映射,排除无效 - 改完必须运行
composer dump-autoload -o,否则不生效
archive.exclude 是打包时用的,跟 install 无关
archive.exclude 控制的是 composer archive 命令和 Packagist 构建 dist 包的内容,对 composer install、update 或自动加载完全没影响。它只在你作为包作者发布版本时起作用。
必须写在 composer.json 根级(和 require 同级),不是 autoload 下:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
{
"name": "my/package",
"archive": {
"exclude": ["/tests", "/docs", "/phpunit.xml"]
}
}
- 路径以
/开头表示精确匹配,避免误删src/MyTests - 不支持
**或*.md,只能列明具体路径 - GitHub “Download ZIP” 不认这个字段——它走
git archive,得靠.gitattributes的export-ignore - 修改后要打新 tag,Packagist 才会重新构建 dist 包
想删 vendor 里的 tests/、docs/?别碰 install 参数
composer install 没有 --exclude、--filter 这类参数。它下载的是完整 dist 包或 source 仓库,根本不扫描文件结构。所谓“排除”,只能靠源头控制或安装后清理。
- 最实际的是用
post-install-cmd脚本删:例如"rm -rf vendor/monolog/monolog/tests" - Windows 用户建议统一用 PHP 脚本,避免
del /s /q权限失败 - CI 或容器环境里
vendor/可能只读,rm -rf会静默失败,加|| true或先chmod +w - 注意:删了文件但没清理 autoload 映射,
class_exists()仍可能返回true,而new直接 fatal error
为什么 exclude-from-classmap 配置后类还在加载?
常见原因不是配置错了,而是其他机制绕过了 classmap 过滤:
- 框架自己注册了额外 autoloader(如 Laravel 的
ProviderRepository预加载服务提供者) - 代码里硬写了
require_once 'src/Tests/Helper.php',跳过了 Composer 自动加载 - OPCache 没刷新,旧的
autoload_classmap.php还在生效(PHP 8.0+ 尤其明显) - 路径大小写错误:Linux 下
"Src/Tests/"≠"src/Tests/" - 该类同时被
psr-4映射,而exclude-from-classmap对 PSR 规则完全无效
真正想禁用某个命名空间的加载,问题不在 Composer 配置,而在业务代码里是否还存在 new App\Legacy\* 或 class_alias() 这类显式引用。

















