| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #!/usr/bin/env node
- import fs from 'node:fs';
- import path from 'node:path';
- import { fileURLToPath } from 'node:url';
- const __filename = fileURLToPath(import.meta.url);
- const __dirname = path.dirname(__filename);
- const projectRoot = path.join(__dirname, '..');
- let preferredVersion;
- let supportedRange;
- try {
- preferredVersion = fs.readFileSync(path.join(projectRoot, '.nvmrc'), 'utf8').trim();
- const packageJson = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8'));
- supportedRange = packageJson.engines?.node || preferredVersion;
- } catch (error) {
- console.error('错误: 无法读取 Node.js 版本配置');
- process.exit(1);
- }
- const currentVersion = process.version.slice(1); // 移除版本号前的 'v'
- console.log(`检查 Node.js 版本...`);
- console.log(`当前版本: ${currentVersion}`);
- console.log(`推荐版本: ${preferredVersion}`);
- console.log(`支持范围: ${supportedRange}`);
- const parseVersion = (version) => {
- const match = String(version).trim().replace(/^v/, '').match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?/);
- if (!match) {
- throw new Error(`Invalid version: ${version}`);
- }
- return {
- major: Number(match[1]),
- minor: Number(match[2] || 0),
- patch: Number(match[3] || 0)
- };
- };
- const current = parseVersion(currentVersion);
- const compareVersions = (left, right) => {
- for (const key of ['major', 'minor', 'patch']) {
- if (left[key] > right[key]) return 1;
- if (left[key] < right[key]) return -1;
- }
- return 0;
- };
- const satisfiesComparator = (version, comparator) => {
- const match = comparator.match(/^(>=|>|<=|<|=)?(.+)$/);
- const operator = match[1] || '=';
- const required = parseVersion(match[2]);
- const comparison = compareVersions(version, required);
- switch (operator) {
- case '>=':
- return comparison >= 0;
- case '>':
- return comparison > 0;
- case '<=':
- return comparison <= 0;
- case '<':
- return comparison < 0;
- case '=':
- return comparison === 0;
- default:
- return false;
- }
- };
- const satisfiesRange = (version, range) => {
- return range
- .split('||')
- .some((rangePart) =>
- rangePart
- .trim()
- .split(/\s+/)
- .filter(Boolean)
- .every((comparator) => satisfiesComparator(version, comparator))
- );
- };
- if (!satisfiesRange(current, supportedRange)) {
- console.error(`\n错误: Node.js 版本不匹配!`);
- console.error(`本项目支持 Node.js ${supportedRange}`);
- console.error(`当前使用的是 Node.js ${currentVersion}`);
-
- console.error(`\n请尝试以下方法之一:`);
- console.error(`1. 如果已安装 nvm: 运行 'nvm install ${preferredVersion} && nvm use ${preferredVersion}'`);
- console.error(`2. 使用项目提供的辅助脚本: './scripts/use-node-version.sh node -v'`);
- console.error(`3. 从 https://nodejs.org/ 下载并安装 Node.js ${preferredVersion}`);
-
- process.exit(1);
- }
- console.log(`\n✓ Node.js 版本检查通过! (${currentVersion})`);
|