$v2[$i]) { return false; } if ($v1[$i] < $v2[$i]) { return true; } } if (count($v1) != count($v2)) { return !(count($v1) > count($v2)); } return false; } /** * 是否是一个数字版本号 * @param $version * @return bool */ public static function checkDigitalVersion($version): bool { 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; } /** * @return string */ public static function getCnpmVersion(): string { $execOut = Terminal::getOutputFromProc('version.cnpm'); if ($execOut) { $preg = '/cnpm@(.+?) \(/is'; preg_match($preg, $execOut, $result); return $result[1] ?? ''; } else { return ''; } } /** * 获取依赖版本号 * @param string $name 支持:npm、cnpm、yarn、pnpm、node * @return string */ public static function getVersion(string $name): string { if ($name == 'cnpm') { return self::getCnpmVersion(); } elseif (in_array($name, ['npm', 'yarn', 'pnpm', 'node'])) { $execOut = Terminal::getOutputFromProc('version.' . $name); if ($execOut) { if (strripos($execOut, 'npm WARN') !== false) { $preg = '/\d+(\.\d+){0,2}/'; preg_match($preg, $execOut, $matches); if (isset($matches[0]) && self::checkDigitalVersion($matches[0])) { return $matches[0]; } } $execOut = preg_split('/\r\n|\r|\n/', $execOut); // 检测两行,第一行可能会是个警告消息 for ($i = 0; $i < 2; $i++) { if (isset($execOut[$i]) && self::checkDigitalVersion($execOut[$i])) { return $execOut[$i]; } } } else { return ''; } } return ''; } }