composer如何查看包的extra字段_composer自定义元数据解析【扩展】

3次阅读

composer show 默认不显示 extra 字段,需通过 composer info –format=json | jq ‘.extra’、查看 installed.json 或调用 installedversions::getrawdata() 安全读取,extra 必须为顶层对象且避免保留键名。

composer如何查看包的extra字段_composer自定义元数据解析【扩展】

composer show 如何读取包的 extra 字段

直接看不出来。composer show 默认不展示 extra,它只输出 name、version、type、autoload 等基础字段。想查某个已安装包的 extra,得绕一下。

  • 先用 composer show vendor/package-name 确认包是否已安装、版本是否匹配
  • 再打开 vendor/composer/installed.json(Composer 2.2+)或 vendor/composer/installed.php(旧版),搜索对应包名,找到 extra 键值
  • 更省事的是用 composer info vendor/package-name --format=json | jq '.extra'(需装 jq),但前提是 Composer CLI 支持 --format=json(2.5+ 才稳定)

在 composer.json 中定义 extra 的常见写法和陷阱

extra 是纯用户自定义字段,Composer 自身不校验结构,但插件或脚本会依赖它——写错格式,下游就崩。

  • 必须是顶层字段,不能嵌套在 requirescripts
  • 值只能是对象({})或 NULL,不能是字符串、数组或布尔值(否则某些插件解析失败)
  • 键名避免用 Composer 内部保留字,比如 branch-aliasclassmap-authoritative,虽然不报错,但行为不可控
  • 示例正确写法:
    {"extra": {"laravel": {"dont-discover": true}, "my-plugin": {"config-path": "config/my.php"}}}

PHP 代码里怎么安全读取 extra 元数据

别硬解析 composer.json 文件——它可能没提交、路径不对、权限受限。优先走 Composer 的运行时机制。

  • 通过 ComposerInstalledVersions::getRawData()(Composer 2.2+)拿到完整安装数据,再提取对应包的 extra
  • 注意:该方法返回的是原始 JSON 解码结果,extra 可能为 null,必须判空
  • 如果用的是旧版 Composer(vendor/composer/installed.json 并自己 json_decode(file_get_contents(...), true),但要处理文件不存在、JSON 解析失败等异常
  • 别缓存未校验的 extra 结果——包更新后内容可能变,尤其当它被其他插件动态修改时

为什么有些 extra 字段在 composer install 后“消失”了

不是真消失,是没被写入 installed.json ——因为只有「当前项目根目录的 composer.json」里的 extra 会被 Composer 记录;依赖包自身的 extra 默认不合并进去。

  • 插件类包(如 phpunit/phpunit)的 extra 通常只供其自身 installer 使用,不会暴露给宿主项目
  • 想让依赖包的 extra 可读,它得显式调用 ComposerInstallerLibraryInstaller::getInstallPath() 或通过自定义 Installer 类写入全局元数据
  • 最常踩的坑:误以为 composer show 能显示依赖包的 extra,其实它只显示根项目的 extra(且不显示)

真正要读依赖包的 extra,唯一可靠方式是打开它的 composer.json 源文件,或者用 ComposerRepositoryInstalledRepositoryInterface 获取原始包信息——但这个接口不稳定,不同 Composer 版本返回结构可能不同。

text=ZqhQzanResources