mcstreetguy / composer-parser
composer.json和lockfile解析器。
Requires (Dev)
- mcstreetguy/tempearly: ^0.4.2
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类用于require
、require-dev
、conflict
、replace
、provide
和suggest
字段。它将如下所示的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-0
和autoload.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
作为第二个参数传递给parse
、parseComposerJson
和parseLockfile
方法来抑制此行为。
版本控制
我们使用SemVer进行版本控制。有关可用版本,请参阅此存储库的标签。
测试
如果您为此项目做出贡献,您必须确保您的更改不会破坏现有功能。因此,此存储库附带PhpUnit测试配置,您可以通过运行make test
来执行。有关如何安装此工具的更多信息,请参阅他们的文档。
作者
- Maximilian Schmidt - 所有者 - MCStreetguy
有关参与此项目的贡献者列表,请参阅。
致谢
特别感谢antonkomarev,他帮助发现和修复了库架构中的几个深层嵌套错误。
许可证
本项目采用MIT许可协议 - 请参阅LICENSE文件以获取详细信息