如何在 PHP 代码中获取 composer.json 中定义的 extra 数据?

尼克
发布: 2025-12-14 13:30:09
原创
223人浏览过
最直接可靠的方式是使用 Composer\InstalledVersions::getRawData() 获取当前项目根包的 extra 数据,因其由 Composer 自动注入且保证 packages[0] 为根包。

如何在 php 代码中获取 composer.json 中定义的 extra 数据?

在 PHP 代码中获取 composer.json 中定义的 extra 数据,最直接可靠的方式是读取已生成的 vendor/composer/installed.json(Composer 2.x)或通过 Composer 的自动加载机制访问其内部数据结构。但更推荐、更稳定的做法是使用 Composer 提供的官方运行时 API —— 即通过 Composer\InstalledVersions 类(Composer 2.0+ 内置),或手动解析 composer.lock / installed.json

使用 InstalledVersions::getRawData()(推荐,Composer 2.2+)

Composer 2.2 起内置了 Composer\InstalledVersions,它在安装/更新后会生成静态元数据,其中包含当前包的 extra 字段(仅限当前项目根包,即你的主项目,不是依赖包)。

  • 确保你项目已执行过 composer installcomposer update
  • 该类无需额外 require,Composer 自动注入(只要用了 Composer 自动加载)
  • 调用 getRawData() 可拿到所有已安装包的原始 JSON 数据数组

示例代码:

// 获取当前项目(root package)的 extra 数据
$rawData = Composer\InstalledVersions::getRawData();
$rootPackage = $rawData['packages'][0] ?? null;
if ($rootPackage && isset($rootPackage['extra'])) {
    $extra = $rootPackage['extra'];
    print_r($extra); // 如 ['my-key' => 'my-value', 'env' => 'prod']
}
登录后复制

⚠️ 注意:packages[0] 是约定——Composer 总把当前项目放在 installed.json 的第一个位置。这是 Composer 的行为保证,可安全依赖。

立即学习PHP免费学习笔记(深入)”;

手动读取 vendor/composer/installed.json

如果环境受限(如低版本 Composer 或需兼容旧项目),可直接解析该文件:

盛世企业网站管理系统1.1.2
盛世企业网站管理系统1.1.2

免费 盛世企业网站管理系统(SnSee)系统完全免费使用,无任何功能模块使用限制,在使用过程中如遇到相关问题可以去官方论坛参与讨论。开源 系统Web代码完全开源,在您使用过程中可以根据自已实际情况加以调整或修改,完全可以满足您的需求。强大且灵活 独创的多语言功能,可以直接在后台自由设定语言版本,其语言版本不限数量,可根据自已需要进行任意设置;系统各模块可在后台自由设置及开启;强大且适用的后台管理支

盛世企业网站管理系统1.1.2 0
查看详情 盛世企业网站管理系统1.1.2
  • 路径固定为 vendor/composer/installed.json
  • 该文件由 Composer 维护,格式稳定,包含所有包的完整信息
  • 需注意文件存在性与 JSON 解析错误处理

示例:

$installedPath = __DIR__ . '/vendor/composer/installed.json';
if (file_exists($installedPath)) {
    $data = json_decode(file_get_contents($installedPath), true);
    $root = $data['packages'][0] ?? [];
    $extra = $root['extra'] ?? [];
}
登录后复制

不推荐:直接解析 composer.json

虽然 composer.json 是源文件,但它不是运行时保证存在的(例如线上部署可能只含 vendor/composer.lock,不含 composer.json)。

  • 路径不确定(可能不在 __DIR__ 下)
  • 无法反映实际安装状态(比如 extra 在开发时改了但没重装)
  • 缺少环境适配(如不同分支、CI 环境可能用不同配置)

所以除非明确用于开发工具类脚本,否则避免直接读 composer.json

小技巧:给 extra 加类型提示或封装访问器

为提升可维护性,建议封装一个简单工具方法:

function getComposerExtra(string $key = null, $default = null) {
    $raw = Composer\InstalledVersions::getRawData();
    $extra = ($raw['packages'][0]['extra'] ?? []) + ['version' => Composer\InstalledVersions::getVersion('your-vendor/your-package')];
    return $key ? ($extra[$key] ?? $default) : $extra;
}
// 使用
$env = getComposerExtra('env', 'dev');
$apiUrl = getComposerExtra('api_url');
登录后复制

基本上就这些。核心原则是:依赖 Composer 运行时生成的权威数据,而不是源码文件。

以上就是如何在 PHP 代码中获取 composer.json 中定义的 extra 数据?的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号