mcstreetguy/composer-parser

composer.json和lockfile解析器。

v1.1.0 2019-09-12 19:31 UTC

This package is auto-updated.

Last update: 2024-09-13 06:04:39 UTC


README

一个无依赖的composer.json和composer.lock文件解析库。

安装

composer require mcstreetguy/composer-parser

使用

解析

我建议使用提供的魔法Factory方法进行解析

use MCStreetguy\ComposerParser\Factory as ComposerParser;

$composerJson = ComposerParser::parse('/path/to/composer.json');
$lockfile = ComposerParser::parse('/path/to/composer.lock');

即使这是获取实例的最简单方法,也可能由于某些原因无法依赖这些自动化(例如,如果文件名不同)。在这种情况下,您也可以直接调用解析方法

$composerJson = ComposerParser::parseComposerJson('/some/file');
$lockfile = ComposerParser::parseLockfile('/another/file');

请注意,ComposerParser不会对任何缺失的字段提出异议,而是用默认值填充所有缺失值,以确保完整性。

异常处理

通过Factory实例化时可能发生两个异常

try {
    $composerJson = ComposerParser::parse('/path/to/composer.json');
} catch (InvalidArgumentException $e) {
    // The given file could not be found or is not readable
} catch (RuntimeException $e) {
    // The given file contained an invalid JSON string
}

手动方式

如果您由于任何原因不能依赖Factory,您也可以直接实例化该类。
但是,这不建议这样做,可能会导致意外的行为。

use \MCStreetguy\ComposerParse\ComposerJson;

$rawData = file_get_contents('/path/to/composer.json');
$parsedData = json_decode($rawData, true);

$composerJson = new ComposerJson($parsedData);

如您所见,构造函数需要一个包含解析后的JSON数据的数组。这适用于库中所有构造函数方法。

子组件

您还可以直接创建子组件。在这种情况下,您需要注意,它们的构造函数仅接受composer声明中的隔离数据(例如,Author类期望您传递author字段中对象的全部内容)。

use \MCStreetguy\ComposerParse\Json\Author;

$rawData = file_get_contents('/path/to/composer.json');
$parsedData = json_decode($rawData, true);

$author = new Author($parsedData['authors'][0]);

数据检索

所有类实例都提供其属性的getter。结构直接来自composer.json模式。包装类的相应属性名称已转换为camelCase(有关更多信息,请参阅PSR-1标准)。

对于任何属性,您都可以使用提供的getter方法。

$license = $composerJson->getLicense();
$version = $composerJson->getVersion();

也可以直接访问属性。请注意,这是只读的!

$description = $composerJson->description;
$require = $composerJson->require;

您还可以在类属性上调用empty()isset()
要检查整个包装器是否为空(对于嵌套类很有用),有一个继承的isEmpty()方法

if ($composerJson->config->isEmpty()) {
    // Do something
}

特殊类

ComposerParser使用一些特殊类来处理JSON模式的部分。

PackageMap

PackageMap类用于requirerequire-devconflictreplaceprovidesuggest字段。它将如下所示的JSON结构

{
    "require": {
        "vendor/package": "^2.3",
        "foo/bar": "dev-master"
    }
}

转换为如下所示的数组结构

$require = [
    [
        "package" => "vendor/package",
        "version" => "^2.3"
    ],
    [
        "package" => "foo/bar",
        "version" => "dev-master"
    ]
]

此外,它实现了Iterator和ArrayAccess接口,因此您可以直接访问其内容或将它放入foreach循环中

$require = $composerJson->getRequire();

$fooBar = $require[1];

foreach ($require as $requirement) {
    $package = $requirement['package'];
    $version = $requirement['version'];

    echo "I need $package at version $version!";
}

如果出于某种原因需要原始映射数据,您可以如下检索它

$map = $require->getData();
NamespaceMap

NamespaceMap用于autoload.psr-0autoload.psr-4字段。实际上,这个类与PackageMap相同。唯一的不同之处在于映射键

{
    "psr-4": {
        "MCStreetguy\\ComposerParser\\": "src/"
    }
}
$psr4 = [
    [
        "namespace" => "MCStreetguy\\ComposerParser\\",
        "source" => "src/"
    ]
]

全局配置

默认情况下,库会尝试加载您的全局配置文件(如果存在)。它遵循文档中定义的composer家目录的位置规则(请参阅文档)。如果没有可读的全局配置文件,则此步骤将静默跳过。

与composer本身一样,以下优先级规则适用于全局配置文件

如果全局配置与本地配置匹配,则项目composer.json中的本地配置始终优先。(来源:https://getcomposer.org.cn/doc/03-cli.md#composer-home-config-json)

您可以通过将true作为第二个参数传递给parseparseComposerJsonparseLockfile方法来抑制此行为。

版本控制

我们使用SemVer进行版本控制。有关可用版本,请参阅此存储库的标签

测试

如果您为此项目做出贡献,您必须确保您的更改不会破坏现有功能。因此,此存储库附带PhpUnit测试配置,您可以通过运行make test来执行。有关如何安装此工具的更多信息,请参阅他们的文档

作者

有关参与此项目的贡献者列表,请参阅。

致谢

特别感谢antonkomarev,他帮助发现和修复了库架构中的几个深层嵌套错误。

许可证

本项目采用MIT许可协议 - 请参阅LICENSE文件以获取详细信息