Files
2026-10-16 13:07:56 +08:00

62 lines
2.2 KiB
JavaScript

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)