composer如何查看包的autoload规则_composer show autoload字段【加载】

2次阅读

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

composer如何查看包的autoload规则_composer show autoload字段【加载】

composer show 命令本身不显示 autoload 字段

直接运行 composer show vendor/package 不会输出该包的 autoload 配置——这是常见误解。Composer 的 show 命令只展示包元信息(如版本、描述、依赖),不解析其 composer.json 中的自动加载规则。

真正要查 autoload,得看源码或用其他方式提取:

  • 进到 vendor/vendorname/package/ 目录,打开它的 composer.json,找 autoloadautoload-dev 字段
  • composer show -s vendor/package-s 表示显示源码路径),再手动 cat 对应的 composer.json
  • 如果包已安装且你只想确认「当前项目里它实际生效了哪些规则」,更可靠的方式是查 Composer 生成的自动加载映射文件:vendor/composer/autoload_static.phpvendor/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": {"VendorPackage": "src/"}

  • 执行 composer dump-autoload -v,看输出里是否提示 “Skipped … because of root package autoload”
  • 检查根 composer.jsonautoload 是否有冲突前缀,比如也写了 "VendorPackage"
  • 临时注释掉 root 的相关映射,再 dump-autoload 测试,能定位是否为覆盖问题

autoload 规则不是“叠加”而是“优先级匹配”,root package 的配置天然权重最高,这点容易被忽略。

text=ZqhQzanResources