136 lines
4.5 KiB
JavaScript
136 lines
4.5 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(`运行安装依赖命令错误,请查看以下报错信息寻找解决方法`));
|
||
} 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(
|
||
`process.versions.node:你的当前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("18.20.6");
|
||
} catch (error) {
|
||
console.error(error.message);
|
||
}
|
||
})();
|