如何验证Composer版本约束中是否支持所需的版本



给定composer.json中需求的任何版本约束,我想验证需求定义是否支持给定版本。假设composer.json需要"php": "^7.4"。那么我希望检查版本7.4会成功,而8.0会失败。

到目前为止,我的实现是使用composer/semver

版本检查器.php

use ComposerSemverComparator;
use ComposerSemverVersionParser;
require_once __DIR__ . '/vendor/autoload.php';
$expectations = [
[true, '7.3.0', '^7.3 || ~8.0.0 || ~8.1.0'],
[true, '7.3.0', '^7.3 || ^8.0'],
[false, '7.3.0', '^7.2'],
[false, '7.3.0', '^7.1'],
[false, '7.3.0', '^5.6 || ^7.0'],
[true, '8.1.0', '^7.3 || ~8.0.0 || ~8.1.0'],
[true, '8.1.0', '>=7.2.5'],
[false, '8.1.0', '^7.3 || ^8.0'],
[false, '8.1.0', '^7.2'],
[false, '8.1.0', '^7.1'],
[false, '8.1.0', '^5.6 || ^7.0'],
];
$versionParser = new VersionParser();
foreach ($expectations as [$expected, $requiredVersion, $actualVersion]) {
$constraint   = $versionParser->parseConstraints($actualVersion);
$lowerVersion = $constraint->getLowerBound()->getVersion();
$compareResult = Comparator::greaterThanOrEqualTo($lowerVersion, $requiredVersion);
if ($expected !== $compareResult) {
printf(
'Failed to assert that required version (%s) with actual version (%s) is %s.' . PHP_EOL,
$requiredVersion,
$actualVersion,
var_export($expected, true)
);
}
}

输出为:

无法断言所需版本(8.1.0(与实际版本(^7.3||~8.0||~8.1.0(为真
无法断言所需版本(8.1.0(与实际版本(>=7.2.5(为真。

如何实现正确的验证?

您有两个问题。

首先,错误的期望。

这四个,都错了:

[
[false, '7.3.0', '^7.2'],
[false, '7.3.0', '^7.1'],
[false, '7.3.0', '^5.6 || ^7.0'],
[false, '8.1.0', '^7.3 || ^8.0'],
]

这些约束确实与版本匹配

这里有插入符号版本范围的文档。基本上,^7.2等于>=7.2 && < 8(等等(。

第二个问题是您使用了错误的方法来检查约束的有效性:

而不是使用这个:

$compareResult = Comparator::greaterThanOrEqualTo($lowerVersion, $requiredVersion);

(请注意,您使用操作数的方式不对,因为这相当于说$lowerVersion >= $requiredVersion,这没有意义(。

你应该做:

$actualConstraint   = $versionParser->parseConstraints($actualVersion);
$compareResult      = $actualConstraint->matches($requiredConstraint);

整个事情加在一起就是:

use ComposerSemverVersionParser;
require_once __DIR__ . '/vendor/autoload.php';
$expectations = [
[true, '7.3.0', '^7.3 || ~8.0.0 || ~8.1.0'],
[true, '7.3.0', '^7.3 || ^8.0'],
[true, '8.1.0', '^7.3 || ~8.0.0 || ~8.1.0'],
[true, '8.1.0', '>=7.2.5'],
[true, '7.3.0', '^7.2'],
[true, '7.3.0', '^7.1'],
[true, '7.3.0', '^5.6 || ^7.0'],
[true, '8.1.0', '^7.3 || ^8.0'],
[false, '8.1.0', '^7.2'],
[false, '8.1.0', '^7.1'],
[false, '8.1.0', '^5.6 || ^7.0'],
];
$versionParser = new VersionParser();
foreach ($expectations as [$expected, $requiredVersion, $actualVersion]) {
$actualConstraint   = $versionParser->parseConstraints($actualVersion);
$requiredConstraint = $versionParser->parseConstraints($requiredVersion);
$compareResult = $actualConstraint->matches($requiredConstraint);
if ($expected !== $compareResult) {
printf(
'Failed to assert that required version (%s) with actual version (%s) is %s.' . PHP_EOL,
$requiredVersion,
$actualVersion,
var_export($expected, true)
);
}
}

相关内容

最新更新