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

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 自身不校验结构,但插件或脚本会依赖它——写错格式,下游就崩。
- 必须是顶层字段,不能嵌套在
require或scripts里 - 值只能是对象(
{})或 null,不能是字符串、数组或布尔值(否则某些插件解析失败) - 键名避免用 Composer 内部保留字,比如
branch-alias、classmap-authoritative,虽然不报错,但行为不可控 - 示例正确写法:
{"extra": {"laravel": {"dont-discover": true}, "my-plugin": {"config-path": "config/my.php"}}}
PHP 代码里怎么安全读取 extra 元数据
别硬解析 composer.json 文件——它可能没提交、路径不对、权限受限。优先走 Composer 的运行时机制。
- 通过
Composer\InstalledVersions::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可读,它得显式调用Composer\Installer\LibraryInstaller::getInstallPath()或通过自定义 Installer 类写入全局元数据 - 最常踩的坑:误以为
composer show能显示依赖包的extra,其实它只显示根项目的extra(且不显示)
真正要读依赖包的 extra,唯一可靠方式是打开它的 composer.json 源文件,或者用 Composer\Repository\InstalledRepositoryInterface 获取原始包信息——但这个接口不稳定,不同 Composer 版本返回结构可能不同。










