62 lines
2.2 KiB
JavaScript
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)
|