xiaoai/php_pc/initialize.js

170 lines
6.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 runNpmScript(scriptName) {
return new Promise((resolve, reject) => {
const command = process.platform === "win32" ? "cmd.exe" : "npm";
const args = process.platform === "win32" ? ["/c", "npm", "run", scriptName] : ["run", scriptName];
const runProcess = spawn(command, args);
runProcess.stdout.on("data", (data) => {
console.log(data.toString());
});
runProcess.stderr.on("data", (data) => {
console.error(data.toString());
});
runProcess.on("close", (code) => {
if (code !== 0) {
reject(new Error(`运行错误,请查看以下报错信息寻找解决方法: ${error.message}`));
} else {
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.example", ".env");
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: "NUXT_API_URL=''",
targetData: `NUXT_API_URL='${domain}'`,
});
await this.writeToFile(".env.production", {
sourceData: "NUXT_API_URL=''",
targetData: `NUXT_API_URL='${domain}'`,
});
this.runNpmScript("dev");
}
static getInstance() {
if (!InitializeItem.instance) {
InitializeItem.instance = new InitializeItem();
}
return InitializeItem.instance;
}
}
(async () => {
const initializeItem = InitializeItem.getInstance();
try {
await initializeItem.initialize("20.11.0");
} catch (error) {
console.error(error.message);
}
})();
// node init (当前)
// 0. 判断当前设备是否安装指定 node 版本以上
// 1. 一键初始化 询问是否已安装npm run install 依赖,如果没有则自动运行安装依赖
// 2. 复制应用相关配置
// 3. 让用户手动输入相关配置
// 4. 初始化完成 运行开发环境
// node fix (如果init后还是不行则考虑运行此插件修复)
// tips (通常因为插件版本问题,所以这边只需要删除锁定的版本文件和相关依赖重新安装)
// 0. 删除yarn.lock 和package-lock.json
// 1. 删除node_modules 文件夹
// 2. 运行npm install 安装依赖
// 3. 安装以后自动运行开发环境