const fs = require('fs') const os = require('os') const path = require('path') const { spawnSync } = require('child_process') const projectRoot = path.resolve(__dirname, '..') const requiredVersion = fs.readFileSync(path.join(projectRoot, '.nvmrc'), 'utf8').trim() const required = requiredVersion.split('.').map(Number) const executable = process.platform === 'win32' ? 'node.exe' : 'node' const candidates = [ process.execPath, path.join(process.env.NVM_DIR || path.join(os.homedir(), '.nvm'), 'versions', 'node', `v${requiredVersion}`, 'bin', executable), path.join(process.env.ASDF_DATA_DIR || path.join(os.homedir(), '.asdf'), 'installs', 'nodejs', requiredVersion, 'bin', executable) ] function supportsProject(version) { const parts = version.replace(/^v/, '').split('.').map(Number) return parts[0] === required[0] && (parts[1] > required[1] || (parts[1] === required[1] && parts[2] >= required[2])) } let runtime let runtimeVersion for (const candidate of candidates) { const result = spawnSync(candidate, ['--version'], { encoding: 'utf8' }) if (!result.error && result.status === 0 && supportsProject(result.stdout.trim())) { runtime = candidate runtimeVersion = result.stdout.trim() break } } if (!runtime) { console.error(`当前 Node ${process.version},项目需要 Node >=${requiredVersion} <${required[0] + 1}。`) console.error('请在项目目录执行 nvm install && nvm use,然后执行 npm ci 并重试原命令。') process.exit(1) } if (runtime !== process.execPath) { console.log(`使用项目 Node ${runtimeVersion}(当前终端 ${process.version}),全局默认版本不变。`) } const result = spawnSync(runtime, [ '--openssl-legacy-provider', path.join(projectRoot, 'node_modules', '@vue', 'cli-service', 'bin', 'vue-cli-service.js') ].concat(process.argv.slice(2)), { cwd: projectRoot, stdio: 'inherit', env: Object.assign({}, process.env, { PATH: path.dirname(runtime) + path.delimiter + (process.env.PATH || '') }) }) if (result.error) { console.error(`启动 Vue CLI 失败:${result.error.message}`) process.exit(1) } if (result.signal) { process.kill(process.pid, result.signal) } process.exit(result.status === null ? 1 : result.status)