【发布时间】:2022-01-20 03:47:35
【问题描述】:
鉴于composer.json 中需求的任何版本约束,我想验证需求定义是否支持给定版本。假设composer.json 需要"php": "^7.4"。然后我希望检查版本7.4 会成功,8.0 会失败。
到目前为止,我的实现是使用composer/semver。
version-checker.php
use Composer\Semver\Comparator;
use Composer\Semver\VersionParser;
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)
);
}
}
输出是:
无法用实际版本 (^7.3 || ~8.0.0 || ~8.1.0) 断言所需版本 (8.1.0) 为真。
无法断言所需版本 (8.1.0) 与实际版本 (>=7.2.5) 为真。
如何进行正确的验证?
【问题讨论】:
标签: php composer-php