composer show 不显示 autoload 字段,需查 vendor/package/composer.json 或 vendor/composer/autoload_*.php;dump-autoload -o 才重扫 classmap;root package 的 autoload 会覆盖依赖包规则。

composer show 命令本身不显示 autoload 字段
直接运行 composer show vendor/package 不会输出该包的 autoload 配置——这是常见误解。Composer 的 show 命令只展示包元信息(如版本、描述、依赖),不解析其 composer.json 中的自动加载规则。
真正要查 autoload,得看源码或用其他方式提取:
- 进到
vendor/vendorname/package/目录,打开它的composer.json,找autoload或autoload-dev字段 - 用
composer show -s vendor/package(-s表示显示源码路径),再手动 cat 对应的composer.json - 如果包已安装且你只想确认「当前项目里它实际生效了哪些规则」,更可靠的方式是查 Composer 生成的自动加载映射文件:
vendor/composer/autoload_static.php或vendor/composer/autoload_classmap.php
autoload 规则在 vendor/composer/autoload_*.php 里才真正落地
Composer 安装包后,会把所有包的 autoload 配置合并、转换成 PHP 数组写入静态文件。这些才是运行时真正读取的规则,比原始 composer.json 更值得 inspect。
常见文件及用途:
-
vendor/composer/autoload_static.php:包含 PSR-4、classmap、files 等映射的静态数组,启动最快 -
vendor/composer/autoload_classmap.php:全量类名 → 文件路径映射(由classmap生成) -
vendor/composer/autoload_namespaces.php:已废弃,仅兼容旧 PSR-0 包
注意:这些文件是自动生成的,不要手动修改;改了也会被下次 composer dump-autoload 覆盖。
dump-autoload 时 classmap 和 PSR-4 行为差异明显
composer dump-autoload 默认只更新 PSR-4/PSR-0 映射,不会重新扫描 classmap 目录——除非加 -o(optimize)或显式指定 --classmap-authoritative。
- 没加
-o:PSR-4 映射是“动态查找”,运行时按命名空间前缀 + 目录拼路径;classmap 若存在,则只加载已缓存的类,新增类不生效 - 加了
-o:强制重扫所有classmap配置项下的目录,并生成完整autoload_classmap.php;同时标记为权威 classmap,跳过 PSR-4 动态查找,性能更高但灵活性降低 - 若包用了
"classmap": ["src/"]却没跑dump-autoload -o,新增的类很可能根本不会被自动加载
第三方包 autoload 不生效?先检查是否被 root package 覆盖
项目根目录的 composer.json 中如果定义了同名 namespace 的 PSR-4 映射,会覆盖依赖包的映射——尤其当路径指向本地 src/ 时,Composer 优先用 root 的规则,导致包内类无法加载。
典型现象:Class vendorpackageFoo not found,但确认包已安装、composer.json 里写了 "psr-4": {"Vendor\Package\": "src/"}。
- 执行
composer dump-autoload -v,看输出里是否提示 “Skipped … because of root package autoload” - 检查根
composer.json的autoload是否有冲突前缀,比如也写了"Vendor\Package\" - 临时注释掉 root 的相关映射,再
dump-autoload测试,能定位是否为覆盖问题
autoload 规则不是“叠加”而是“优先级匹配”,root package 的配置天然权重最高,这点容易被忽略。










