mirror of
https://gitee.com/wonderful-code/buildadmin
synced 2024-11-23 07:40:18 +00:00
112 lines
2.8 KiB
PHP
112 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace bd;
|
|
|
|
use app\installapi\controller\CommandExec;
|
|
|
|
/**
|
|
* 版本类
|
|
*/
|
|
class Version
|
|
{
|
|
/**
|
|
* 提取版本号中的数字
|
|
* @param $str
|
|
* @return array|string|string[]|null
|
|
*/
|
|
public static function reg(string $str)
|
|
{
|
|
return preg_replace('/[^0-9]/', '', $str);
|
|
}
|
|
|
|
/**
|
|
* 版本号位数不足时补位0
|
|
* @param $str
|
|
* @param $length
|
|
* @return string
|
|
*/
|
|
public static function cover(string $str, int $length): string
|
|
{
|
|
return str_pad($str, $length, '0');
|
|
}
|
|
|
|
/**
|
|
* 比较两个版本号
|
|
* @param $v1 string 要求的版本号
|
|
* @param $v2 string | bool 被比较版本号
|
|
* @return bool 是否达到要求的版本号
|
|
*/
|
|
public static function compare(string $v1, $v2): bool
|
|
{
|
|
if (!$v2) {
|
|
return false;
|
|
}
|
|
|
|
// 删除开头的 V
|
|
if (strtolower($v2[0]) == 'v') {
|
|
$v2 = substr($v2, 1);
|
|
}
|
|
|
|
if ($v1 == "*" || $v1 == $v2) {
|
|
return true;
|
|
}
|
|
|
|
$length = strlen(self::reg($v1)) > strlen(self::reg($v2)) ? strlen(self::reg($v1)) : strlen(self::reg($v2));
|
|
$v1 = self::cover(self::reg($v1), $length);
|
|
$v2 = self::cover(self::reg($v2), $length);
|
|
if ($v1 == $v2) {
|
|
return true;
|
|
} else {
|
|
return $v2 > $v1;
|
|
}
|
|
}
|
|
|
|
public static function checkDigitalVersion($version)
|
|
{
|
|
if (!$version) {
|
|
return false;
|
|
}
|
|
if (strtolower($version[0]) == 'v') {
|
|
$version = substr($version, 1);
|
|
}
|
|
|
|
$rule1 = '/\.{2,10}/'; // 是否有两个的`.`
|
|
$rule2 = '/^\d+(\.\d+){0,10}$/';
|
|
if (!preg_match($rule1, (string)$version)) {
|
|
return !!preg_match($rule2, (string)$version);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static function getNpmVersion()
|
|
{
|
|
$execOut = CommandExec::instance()->getOutputFromPopen('npm-v');
|
|
if ($execOut && isset($execOut[0]) && self::checkDigitalVersion($execOut[0])) {
|
|
return $execOut[0];
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function getCnpmVersion()
|
|
{
|
|
$execOut = CommandExec::instance()->getOutputFromPopen('cnpm-v');
|
|
if ($execOut && isset($execOut[0])) {
|
|
$preg = '/cnpm@(.+?) \(/is';
|
|
preg_match($preg, $execOut[0], $result);
|
|
return $result[1] ?? false;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static function getNodeJsVersion()
|
|
{
|
|
$execOut = CommandExec::instance()->getOutputFromPopen('node-v');
|
|
if ($execOut && isset($execOut[0]) && self::checkDigitalVersion($execOut[0])) {
|
|
return $execOut[0];
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
} |