1 line
4.6 KiB
JavaScript
1 line
4.6 KiB
JavaScript
const fs = require('fs')
|
||
const { spawn } = require('child_process')
|
||
|
||
|
||
class InitializeItem {
|
||
static instance = null
|
||
|
||
constructor() {
|
||
if (InitializeItem.instance) {
|
||
return InitializeItem.instance
|
||
}
|
||
InitializeItem.instance = this
|
||
}
|
||
|
||
async promptUser(question) {
|
||
return new Promise((resolve, reject) => {
|
||
const readline = require('readline')
|
||
const rl = readline.createInterface({
|
||
input: process.stdin,
|
||
output: process.stdout
|
||
})
|
||
rl.question(question, (res) => {
|
||
resolve(res)
|
||
rl.close()
|
||
})
|
||
})
|
||
}
|
||
|
||
async shouldInstallDependencies() {
|
||
const isInstall = await this.promptUser(
|
||
'是否需要自动帮您安装依赖(y/n):'
|
||
)
|
||
if (isInstall.toLowerCase() === 'y') {
|
||
return true
|
||
} else if (isInstall.toLowerCase() === 'n') {
|
||
return false
|
||
} else {
|
||
return this.shouldInstallDependencies()
|
||
}
|
||
}
|
||
|
||
async installDependencies() {
|
||
return new Promise((resolve, reject) => {
|
||
console.log('开始安装相关依赖...')
|
||
const command = process.platform === 'win32' ? 'cmd.exe' : 'npm'
|
||
const args =
|
||
process.platform === 'win32'
|
||
? ['/c', 'npm', 'install']
|
||
: ['install']
|
||
const installProcess = spawn(command, args)
|
||
|
||
installProcess.stdout.on('data', (data) => {
|
||
console.log(data.toString())
|
||
})
|
||
installProcess.stderr.on('data', (data) => {
|
||
console.error(data.toString())
|
||
})
|
||
installProcess.on('close', (code) => {
|
||
if (code !== 0) {
|
||
reject(
|
||
new Error(
|
||
`运行安装依赖命令错误,请查看以下报错信息寻找解决方法: ${error.message}`
|
||
)
|
||
)
|
||
} else {
|
||
console.log('安装依赖成功!')
|
||
resolve()
|
||
}
|
||
})
|
||
})
|
||
}
|
||
|
||
async copyFile(sourceDir, targetDir) {
|
||
return new Promise((resolve, reject) => {
|
||
fs.copyFile(sourceDir, targetDir, (error) => {
|
||
if (error) {
|
||
reject(error)
|
||
throw new Error(`复制文件失败: ${error.message}`)
|
||
}
|
||
resolve()
|
||
})
|
||
})
|
||
}
|
||
|
||
async writeToFile(filePath, { sourceData, targetData }) {
|
||
return new Promise((resolve, reject) => {
|
||
fs.readFile(filePath, 'utf8', (err, data) => {
|
||
if (err) {
|
||
console.error('读取文件失败:', err)
|
||
return
|
||
}
|
||
const modifiedData = data.replace(sourceData, targetData)
|
||
fs.writeFile(filePath, modifiedData, 'utf8', (err) => {
|
||
if (err) {
|
||
console.error('写入文件错误:', err)
|
||
return
|
||
}
|
||
resolve()
|
||
})
|
||
})
|
||
})
|
||
}
|
||
|
||
async initialize(targetVersion) {
|
||
const currentVersion = process.versions.node
|
||
if (currentVersion < targetVersion) {
|
||
throw new Error(
|
||
`你的当前node版本为(${currentVersion}),需要安装目标版本为 ${targetVersion} 以上!!`
|
||
)
|
||
}
|
||
|
||
const shouldInstall = await this.shouldInstallDependencies()
|
||
if (shouldInstall) {
|
||
await this.installDependencies()
|
||
}
|
||
await this.copyFile('.env.development.example', '.env.development')
|
||
await this.copyFile('.env.production.example', '.env.production')
|
||
const domain = await this.promptUser('请输入您的服务器域名地址:')
|
||
await this.writeToFile('.env.development', {
|
||
sourceData: `VITE_APP_BASE_URL=''`,
|
||
targetData: `VITE_APP_BASE_URL='${domain}'`
|
||
})
|
||
await this.writeToFile('.env.production', {
|
||
sourceData: `VITE_APP_BASE_URL=''`,
|
||
targetData: `VITE_APP_BASE_URL='${domain}'`
|
||
})
|
||
require('./scripts/develop');
|
||
}
|
||
|
||
static getInstance() {
|
||
if (!InitializeItem.instance) {
|
||
InitializeItem.instance = new InitializeItem()
|
||
}
|
||
return InitializeItem.instance
|
||
}
|
||
}
|
||
|
||
;(async () => {
|
||
const initializeItem = InitializeItem.getInstance()
|
||
try {
|
||
await initializeItem.initialize('16.16.0')
|
||
} catch (error) {
|
||
console.error(error.message)
|
||
}
|
||
})() |