修改 导入utils模块出错问题
This commit is contained in:
parent
f1b51992ba
commit
7cab1b48ae
|
@ -28,7 +28,7 @@ import { KeyCode } from 'vs/base/common/keyCodes';
|
||||||
import { mainWindow } from 'vs/base/browser/window';
|
import { mainWindow } from 'vs/base/browser/window';
|
||||||
import { ThemeIcon } from 'vs/base/common/themables';
|
import { ThemeIcon } from 'vs/base/common/themables';
|
||||||
import { Codicon } from 'vs/base/common/codicons';
|
import { Codicon } from 'vs/base/common/codicons';
|
||||||
import { get_g_index_url, configDir } from 'vs/platform/issue/electron-main/utils';
|
import * as utils from 'vs/platform/issue/electron-main/utils';
|
||||||
|
|
||||||
import { addDisposableListener, EventType, getWindow, getWindowId, hide, show } from 'vs/base/browser/dom';
|
import { addDisposableListener, EventType, getWindow, getWindowId, hide, show } from 'vs/base/browser/dom';
|
||||||
import { isDisposable } from 'vs/base/common/lifecycle';
|
import { isDisposable } from 'vs/base/common/lifecycle';
|
||||||
|
@ -239,8 +239,8 @@ class deployWindow {
|
||||||
preElement!.innerHTML = "";
|
preElement!.innerHTML = "";
|
||||||
|
|
||||||
const messageData = {
|
const messageData = {
|
||||||
url: get_g_index_url(),
|
url: utils.get_g_index_url(),
|
||||||
dst: configDir()
|
dst: utils.configDir()
|
||||||
}
|
}
|
||||||
//联网检查是否有合适的文件
|
//联网检查是否有合适的文件
|
||||||
ipcRenderer.send("kylinide.installWizard.checkInstall", messageData);
|
ipcRenderer.send("kylinide.installWizard.checkInstall", messageData);
|
||||||
|
@ -305,9 +305,12 @@ class deployWindow {
|
||||||
dTpreElement!.innerHTML = '';
|
dTpreElement!.innerHTML = '';
|
||||||
let dTformattedDoc = '';
|
let dTformattedDoc = '';
|
||||||
|
|
||||||
|
console.log("progressNum:" + this.progressNum + " extInstallState.size:" + this.extInstallState.size)
|
||||||
|
if (this.extInstallState.size > 0) {
|
||||||
let progressViews = document.getElementsByClassName("progress-view") as HTMLCollectionOf<HTMLProgressElement>;
|
let progressViews = document.getElementsByClassName("progress-view") as HTMLCollectionOf<HTMLProgressElement>;
|
||||||
progressViews[0].value = (this.progressNum / this.extInstallState.size) * 100;
|
progressViews[0].value = (this.progressNum / this.extInstallState.size) * 100;
|
||||||
document.getElementsByClassName("progressinfo")[0].innerHTML = "安装进度:" + ((this.progressNum / this.extInstallState.size) * 100).toFixed(2) + "%";
|
document.getElementsByClassName("progressinfo")[0].innerHTML = "安装进度:" + ((this.progressNum / this.extInstallState.size) * 100).toFixed(2) + "%";
|
||||||
|
}
|
||||||
|
|
||||||
for (const [key, value] of this.extInstallState) {
|
for (const [key, value] of this.extInstallState) {
|
||||||
if (key === undefined) continue;
|
if (key === undefined) continue;
|
||||||
|
@ -527,7 +530,7 @@ class deployWindow {
|
||||||
console.log("onlineInstallArrayIndex:" + this.onlineInstallTabArrayIndex);
|
console.log("onlineInstallArrayIndex:" + this.onlineInstallTabArrayIndex);
|
||||||
if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab1") {
|
if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab1") {
|
||||||
//获取radio的值
|
//获取radio的值
|
||||||
|
console.log("onlineInstallTab1");
|
||||||
let select = "local";
|
let select = "local";
|
||||||
if (this.onlineUpdateConfigRadio && this.onlineUpdateConfigRadio instanceof HTMLInputElement && this.onlineUpdateConfigRadio.checked) {
|
if (this.onlineUpdateConfigRadio && this.onlineUpdateConfigRadio instanceof HTMLInputElement && this.onlineUpdateConfigRadio.checked) {
|
||||||
select = "update"
|
select = "update"
|
||||||
|
@ -542,9 +545,11 @@ class deployWindow {
|
||||||
type: "configGetValue",
|
type: "configGetValue",
|
||||||
class: "install"
|
class: "install"
|
||||||
}
|
}
|
||||||
|
console.log("onlineInstallTab2");
|
||||||
ipcRenderer.send('kylinide.installWizard.init', data);
|
ipcRenderer.send('kylinide.installWizard.init', data);
|
||||||
} else if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab3") {
|
} else if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab3") {
|
||||||
const checkboxForm = document.getElementById("checkboxForm");
|
const checkboxForm = document.getElementById("checkboxForm");
|
||||||
|
console.log("onlineInstallTab3");
|
||||||
// 获取所有选中的复选框
|
// 获取所有选中的复选框
|
||||||
let selectedCheckboxes = checkboxForm!.querySelectorAll('input[type="checkbox"]:checked');
|
let selectedCheckboxes = checkboxForm!.querySelectorAll('input[type="checkbox"]:checked');
|
||||||
let checkSelectedValues = [];
|
let checkSelectedValues = [];
|
||||||
|
@ -622,10 +627,12 @@ class deployWindow {
|
||||||
ipcRenderer.send('kylinide.installWizard.init', { type: "writeJson", });
|
ipcRenderer.send('kylinide.installWizard.init', { type: "writeJson", });
|
||||||
} else if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab4") {
|
} else if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab4") {
|
||||||
ipcRenderer.send('kylinide.installWizard.ok');
|
ipcRenderer.send('kylinide.installWizard.ok');
|
||||||
|
console.log("onlineInstallTab4");
|
||||||
this.removeAllListeners();
|
this.removeAllListeners();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.onlineInstallTabArrayIndex < this.onlineInstallTabArray.length - 1) {
|
if (this.onlineInstallTabArrayIndex < this.onlineInstallTabArray.length - 1) {
|
||||||
|
console.log("this.onlineInstallTabArrayIndex < this.onlineInstallTabArray.length - 1");
|
||||||
if (this.onlineInstallTabArrayIndex == 0) {
|
if (this.onlineInstallTabArrayIndex == 0) {
|
||||||
console.log("在线安装");
|
console.log("在线安装");
|
||||||
ipcRenderer.send("kylinide.installWizard.init", { type: "httpVerify" });
|
ipcRenderer.send("kylinide.installWizard.init", { type: "httpVerify" });
|
||||||
|
@ -645,6 +652,7 @@ class deployWindow {
|
||||||
|
|
||||||
// }
|
// }
|
||||||
if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab4") {
|
if (this.onlineInstallTabArray[this.onlineInstallTabArrayIndex] === "onlineInstallTab4") {
|
||||||
|
console.log("onlineInstallTab4 last");
|
||||||
this.prevBtn!.disabled = true;
|
this.prevBtn!.disabled = true;
|
||||||
this.nextBtn!.disabled = true;
|
this.nextBtn!.disabled = true;
|
||||||
this.nextBtn!.innerHTML = "确定";
|
this.nextBtn!.innerHTML = "确定";
|
||||||
|
@ -720,12 +728,18 @@ class deployWindow {
|
||||||
console.log('click nextStep');
|
console.log('click nextStep');
|
||||||
this.nextPrev(1);
|
this.nextPrev(1);
|
||||||
});
|
});
|
||||||
|
document.getElementById('cancel')?.addEventListener('click', () => {
|
||||||
|
console.log('cancel');
|
||||||
|
// ipcRenderer.removeAllListeners('kylinide.installWizard.msg');
|
||||||
|
ipcRenderer.send('kylinide.installWizard.msg.process', { type: "cancel" });
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 安装界面:安装详情显示/隐藏切换按钮
|
* 安装界面:安装详情显示/隐藏切换按钮
|
||||||
*/
|
*/
|
||||||
document.getElementById("switchInstallOutput")?.addEventListener("click", () => {
|
document.getElementById("switchInstallOutput")?.addEventListener("click", () => {
|
||||||
// 切换显示和隐藏
|
// 切换显示和隐藏
|
||||||
|
console.log("switchInstallOutput clicked");
|
||||||
const logPreElement = document.getElementById("installLogPre");
|
const logPreElement = document.getElementById("installLogPre");
|
||||||
const installPreElement = document.getElementById("detailInstallPre");
|
const installPreElement = document.getElementById("detailInstallPre");
|
||||||
const extLogPreElement = document.getElementById("extInstallLogPre");
|
const extLogPreElement = document.getElementById("extInstallLogPre");
|
||||||
|
@ -1086,7 +1100,7 @@ class deployWindow {
|
||||||
extList: this.extList,
|
extList: this.extList,
|
||||||
depList: this.depList,
|
depList: this.depList,
|
||||||
script: obj,
|
script: obj,
|
||||||
dst: configDir()
|
dst: utils.configDir()
|
||||||
};
|
};
|
||||||
ipcRenderer.send("kylinide.installWizard.msg.process", installMsg);
|
ipcRenderer.send("kylinide.installWizard.msg.process", installMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,23 @@ export class DeployMainService implements IDeployMainService {
|
||||||
depList: string[] = [];
|
depList: string[] = [];
|
||||||
extList: string[] = [];
|
extList: string[] = [];
|
||||||
lastLogPosition: number = 0;
|
lastLogPosition: number = 0;
|
||||||
|
//文件监听;
|
||||||
|
installFsWatcher: fs.FSWatcher | null = null;
|
||||||
|
extlogFsWatcher: fs.FSWatcher | null = null;
|
||||||
|
pkglogFsWatcher: fs.FSWatcher | null = null;
|
||||||
|
//执行安装脚本的进程号;
|
||||||
|
installProcessId: ChildProcess | null = null;
|
||||||
|
cancelFlag = false;
|
||||||
|
|
||||||
|
flagPkexec = 0;
|
||||||
|
maxBackupFiles = 7;
|
||||||
|
lastExtLogPosition = 0;
|
||||||
|
|
||||||
|
logFile0 = "";
|
||||||
|
resultFile = "";
|
||||||
|
extLogFile0 = "";
|
||||||
|
|
||||||
|
controller = new AbortController();
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private userEnv: IProcessEnvironment,
|
private userEnv: IProcessEnvironment,
|
||||||
|
@ -133,6 +150,10 @@ export class DeployMainService implements IDeployMainService {
|
||||||
this.localConfigDir = installUtils.localConfigPath();
|
this.localConfigDir = installUtils.localConfigPath();
|
||||||
this.installConfig = installUtils.installConfigDirPre();//installconfig
|
this.installConfig = installUtils.installConfigDirPre();//installconfig
|
||||||
this.updateConfigDir = installUtils.installConfigDirPre() + "/" + installUtils.getDateDir();
|
this.updateConfigDir = installUtils.installConfigDirPre() + "/" + installUtils.getDateDir();
|
||||||
|
this.logFile0 = this.installConfig + '/log/install.1.log';
|
||||||
|
this.resultFile = this.installConfig + '/resultFile';
|
||||||
|
this.extLogFile0 = this.installConfig + '/log/extInstall.1.log';
|
||||||
|
|
||||||
this.registerListeners();
|
this.registerListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,12 +176,348 @@ export class DeployMainService implements IDeployMainService {
|
||||||
this.closeWindow();
|
this.closeWindow();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
validatedIpcMain.on('kylinide.installWizard.msg.process', async (event, msg) => {
|
||||||
|
if (msg.type === 'installExt') {
|
||||||
|
|
||||||
|
const logFile0 = this.installConfig + '/log/extInstall.1.log';
|
||||||
|
|
||||||
|
if (!fs.existsSync(logFile0)) {
|
||||||
|
fs.mkdirSync(this.installConfig + "/log", { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const installItem = this.extDownloadPath + msg.downloadDone;
|
||||||
|
const installCommand = "kylin-code --install-extension " + installItem;
|
||||||
|
if (this.installQueue.length === 0) {
|
||||||
|
this.installQueue.push({ installCommand, msg });
|
||||||
|
await this.executeNextInstall();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.installQueue.push({ installCommand, msg });
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`执行出错: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (msg.type === 'installPkg') {
|
||||||
|
console.log("kylinide.installWizard.msg.process:installPkg");
|
||||||
|
const extlogFile = this.installConfig + '/log/extInstall.log';
|
||||||
|
this.backupLogFile(extlogFile)
|
||||||
|
const extlogFile0 = this.installConfig + '/log/extInstall.1.log';
|
||||||
|
fs.writeFileSync(extlogFile0, '');
|
||||||
|
|
||||||
|
if (this.depList.length === 0) {
|
||||||
|
const startDownloadExtMsg = {
|
||||||
|
type: "extDownloadInit",
|
||||||
|
}
|
||||||
|
if (this.DeployWindow)
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", startDownloadExtMsg);
|
||||||
|
this.lastExtLogPosition = 0;
|
||||||
|
|
||||||
|
fs.watch(this.extLogFile0, (eventType, filename) => {
|
||||||
|
|
||||||
|
if (eventType === 'change') {
|
||||||
|
// 获取文件的当前大小
|
||||||
|
const stats = fs.statSync(this.extLogFile0);
|
||||||
|
const currentSize = stats.size;
|
||||||
|
|
||||||
|
// 计算更新部分的大小
|
||||||
|
const updateSize = currentSize - this.lastExtLogPosition;
|
||||||
|
if (updateSize <= 0) return;
|
||||||
|
// 读取更新部分的内容
|
||||||
|
const buffer = Buffer.alloc(updateSize);
|
||||||
|
const fileDescriptor = fs.openSync(this.extLogFile0, 'r');
|
||||||
|
fs.readSync(fileDescriptor, buffer, 0, updateSize, this.lastExtLogPosition);
|
||||||
|
fs.closeSync(fileDescriptor);
|
||||||
|
|
||||||
|
// 将更新部分的内容转换为字符串并输出
|
||||||
|
const updatedContent = buffer.toString('utf8');
|
||||||
|
|
||||||
|
// 更新上一次读取的位置
|
||||||
|
this.lastExtLogPosition = currentSize;
|
||||||
|
const installMsg = {
|
||||||
|
type: "extInstallLogPre",
|
||||||
|
data: updatedContent
|
||||||
|
};
|
||||||
|
|
||||||
|
if (this.DeployWindow)
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", installMsg)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastLogPosition = 0;
|
||||||
|
this.lastExtLogPosition = 0;
|
||||||
|
const logFile = this.installConfig + '/log/install.log';
|
||||||
|
const resultFile = this.installConfig + '/resultFile';
|
||||||
|
const installFile = this.installConfig + '/install.sh';
|
||||||
|
const logFile0 = this.installConfig + '/log/install.1.log';
|
||||||
|
this.backupLogFile(logFile);
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.writeFileSync(resultFile, '');
|
||||||
|
fs.writeFileSync(installFile, '');
|
||||||
|
fs.writeFileSync(logFile0, '');
|
||||||
|
const installMsg = {
|
||||||
|
type: "depStartInstall",
|
||||||
|
depName: 'depStartInstall'
|
||||||
|
};
|
||||||
|
|
||||||
|
if (this.DeployWindow)
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", installMsg)
|
||||||
|
|
||||||
|
if (this.depList.length === 0) return;
|
||||||
|
|
||||||
|
this.depList.forEach((packageName) => {
|
||||||
|
const command = `apt-get install -y ${packageName} >> ${logFile0};\necho $? >> ${resultFile};\n`;
|
||||||
|
fs.appendFileSync(installFile, command);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.executeScriptWithPkexec(installFile);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (msg.type === 'installScript') {
|
||||||
|
if (msg.script['file_name'].endsWith(".js")) {
|
||||||
|
try {
|
||||||
|
await this.loadAndInvokeFunction(this.selectObject.dirPath + '/' + msg.script['file_name'], "main");
|
||||||
|
const scriptMsg = {
|
||||||
|
type: "scriptExecSucc",
|
||||||
|
depName: msg.script['file_name']
|
||||||
|
};
|
||||||
|
logger.info("脚本执行成功" + this.selectObject.dirPath + '/' + msg.script['file_name']);
|
||||||
|
if (this.DeployWindow)
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", scriptMsg)
|
||||||
|
} catch {
|
||||||
|
const scriptMsg = {
|
||||||
|
type: "scriptExecFail",
|
||||||
|
depName: msg.script['file_name']
|
||||||
|
};
|
||||||
|
logger.info("脚本执行失败" + this.selectObject.dirPath + '/' + msg.script['file_name']);
|
||||||
|
if (this.DeployWindow)
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", scriptMsg)
|
||||||
|
}
|
||||||
|
} else if (msg.script['file_name'].endsWith(".sh")) {
|
||||||
|
let command = "sh " + this.selectObject.dirPath + '/' + msg.script['file_name'];
|
||||||
|
// await executeCommand(command);
|
||||||
|
this.executeCommand(command).then(res => {
|
||||||
|
const scriptMsg = {
|
||||||
|
type: "scriptExecSucc",
|
||||||
|
depName: msg.script['file_name']
|
||||||
|
};
|
||||||
|
logger.info("脚本执行成功" + this.selectObject.dirPath + '/' + msg.script['file_name']);
|
||||||
|
if (this.DeployWindow)
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", scriptMsg)
|
||||||
|
}).catch(error => {
|
||||||
|
const scriptMsg = {
|
||||||
|
type: "scriptExecFail",
|
||||||
|
depName: msg.script['file_name']
|
||||||
|
};
|
||||||
|
logger.info("脚本执行失败" + this.selectObject.dirPath + '/' + msg.script['file_name']);
|
||||||
|
if (this.DeployWindow)
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", scriptMsg)
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (msg.type == "cancel") {
|
||||||
|
//1.结束监听
|
||||||
|
//2.结束正在执行的进程,下载,插件安装,软件包安装
|
||||||
|
if (this.installProcessId && this.installProcessId.pid && this.installProcessId.exitCode == null && this.flagPkexec == 0) {
|
||||||
|
console.log("取消安装before");
|
||||||
|
// var killcommand = `pkexec sudo pkill -TERM -P ${installProcessId.pid}`;
|
||||||
|
var killcommand = `pkexec sudo pkill -f 'bash ${this.installConfig}/install.sh'`;
|
||||||
|
const sudokill = spawn(killcommand, { shell: true, stdio: 'inherit' });
|
||||||
|
|
||||||
|
sudokill.on('exit', (code, signal) => {
|
||||||
|
if (code == 127) {
|
||||||
|
console.log('授权失败', code);
|
||||||
|
logger.error("取消安装授权失败");
|
||||||
|
} else {
|
||||||
|
if (this.DeployWindow) {
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.removeFileLister", { type: 'installFile' });
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.removeFileLister", { type: 'extFile' });
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.removeFileLister", { type: 'pkgFile' });
|
||||||
|
}
|
||||||
|
this.controller.abort();
|
||||||
|
this.installQueue.splice(0);
|
||||||
|
//结束插件下载及安装
|
||||||
|
if (this.DeployWindow) {
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.cancelinstall", { type: "cancelinstall" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log('kill Exit code:', code);
|
||||||
|
});
|
||||||
|
console.log("取消安装after");
|
||||||
|
} else {
|
||||||
|
if (this.DeployWindow) {
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.removeFileLister", { type: 'installFile' });
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.removeFileLister", { type: 'extFile' });
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.removeFileLister", { type: 'pkgFile' });
|
||||||
|
}
|
||||||
|
this.controller.abort();
|
||||||
|
this.cancelFlag = true;
|
||||||
|
this.installQueue.splice(0);
|
||||||
|
//结束插件下载及安装
|
||||||
|
if (this.DeployWindow) {
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.cancelinstall", { type: "cancelinstall" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// validatedIpcMain.on('kylinide.installWizard.skipWizard', event => {
|
// validatedIpcMain.on('kylinide.installWizard.skipWizard', event => {
|
||||||
// logger.info("跳过操作");
|
// logger.info("跳过操作");
|
||||||
// })
|
// })
|
||||||
}
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
executeScriptWithPkexec(scriptPath: string) {
|
||||||
|
this.flagPkexec = 0;
|
||||||
|
console.log("executeScriptWithPkexec");
|
||||||
|
try {
|
||||||
|
const pkexecCommand = `pkexec sudo bash ${scriptPath}`;
|
||||||
|
this.installProcessId =
|
||||||
|
spawn(pkexecCommand, { shell: true, stdio: 'inherit' });
|
||||||
|
|
||||||
|
this.installProcessId.on('exit', (code, signal) => {
|
||||||
|
this.flagPkexec++;
|
||||||
|
console.log('Exit code:', code);
|
||||||
|
if (code == 127) {
|
||||||
|
//授权失败,结束安装。
|
||||||
|
if (this.DeployWindow) {
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.Auth", { type: "pkgNotAuth" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`执行脚本时出错: ${error.message}`);
|
||||||
|
// return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取备份文件名
|
||||||
|
getBackupFileName(filePath: string, index: number) {
|
||||||
|
const path = require('path');
|
||||||
|
const extname = path.extname(filePath);
|
||||||
|
const basename = path.basename(filePath, extname);
|
||||||
|
return `${basename}.${index}${extname}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 备份日志文件
|
||||||
|
backupLogFile(filePath: string) {
|
||||||
|
const path = require('path');
|
||||||
|
for (let i = this.maxBackupFiles - 1; i >= 0; i--) {
|
||||||
|
const currentFileName = i === 0 ? filePath : this.getBackupFileName(filePath, i);
|
||||||
|
const nextFileName = this.getBackupFileName(filePath, i + 1);
|
||||||
|
const currentFilePath = path.join(path.dirname(filePath), currentFileName);
|
||||||
|
const nextFilePath = path.join(path.dirname(filePath), nextFileName);
|
||||||
|
|
||||||
|
if (fs.existsSync(currentFilePath)) {
|
||||||
|
if (i === this.maxBackupFiles - 1) {
|
||||||
|
if (fs.existsSync(nextFileName))
|
||||||
|
fs.unlinkSync(nextFilePath);
|
||||||
|
}
|
||||||
|
fs.copyFileSync(currentFilePath, nextFilePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async executeNextInstall() {
|
||||||
|
if (this.installQueue.length === 0) {
|
||||||
|
return; // 队列为空,结束执行
|
||||||
|
}
|
||||||
|
if (this.cancelFlag) {
|
||||||
|
this.installQueue.splice(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const { installCommand, msg } = this.installQueue[0];
|
||||||
|
try {
|
||||||
|
const extlogFile = this.installConfig + '/log/extInstall.1.log';
|
||||||
|
|
||||||
|
let ret: { stdout: string, stderr: string } = await this.spawnCommand(installCommand) as { stdout: string; stderr: string; };
|
||||||
|
if (ret.stdout)
|
||||||
|
fs.appendFileSync(extlogFile, ret.stdout);
|
||||||
|
// if (ret.stderr)
|
||||||
|
// fs.appendFileSync(extlogFile, ret.stderr);
|
||||||
|
|
||||||
|
const installMsg = {
|
||||||
|
type: "extInstalled",
|
||||||
|
extFileName: msg.downloadDone,
|
||||||
|
// extTotal: Object.keys(extMap).length,
|
||||||
|
extTotal: this.extList.length
|
||||||
|
};
|
||||||
|
if (this.DeployWindow) {
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", installMsg);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`执行出错: ${error.message}`);
|
||||||
|
const extlogFile = this.installConfig + '/log/extInstall.1.log';
|
||||||
|
fs.appendFileSync(extlogFile, installCommand);
|
||||||
|
fs.appendFileSync(extlogFile, '\n');
|
||||||
|
fs.appendFileSync(extlogFile, error.message);
|
||||||
|
fs.appendFileSync(extlogFile, '\n');
|
||||||
|
const installMsg = {
|
||||||
|
type: "extInstalledFail",
|
||||||
|
extFileName: msg.downloadDone,
|
||||||
|
extTotal: this.extList.length,
|
||||||
|
extName: msg.extName
|
||||||
|
};
|
||||||
|
if (this.DeployWindow) {
|
||||||
|
this.DeployWindow.webContents.send("kylinide.installWizard.msg", installMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.installQueue.shift(); // 执行完成后,将当前消息从队列中移除
|
||||||
|
await this.executeNextInstall(); // 继续执行下一个消息
|
||||||
|
}
|
||||||
|
|
||||||
|
spawnCommand(command: string) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const child = spawn(command, { shell: true });
|
||||||
|
|
||||||
|
let stdout = '';
|
||||||
|
let stderr = '';
|
||||||
|
|
||||||
|
child.stdout.on('data', (data) => {
|
||||||
|
stdout += data.toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
child.stderr.on('data', (data) => {
|
||||||
|
stderr += data.toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
child.on('close', (code) => {
|
||||||
|
if (code === 0) {
|
||||||
|
resolve({ stdout, stderr });
|
||||||
|
} else {
|
||||||
|
reject(new Error(`Command failed with exit code ${code} `));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async executeCommand(command: string) {
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
|
const { exec } = require('child_process');
|
||||||
|
exec(command, (error: any, stdout: any, stderr: any) => {
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
} else {
|
||||||
|
// console.log(`stdout: ${ stdout } `);
|
||||||
|
// console.error(`stderr1: ${ stderr } `);
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
minWindow() {
|
minWindow() {
|
||||||
if (this.DeployWindow) {
|
if (this.DeployWindow) {
|
||||||
this.DeployWindow.minimize();
|
this.DeployWindow.minimize();
|
||||||
|
@ -226,7 +583,7 @@ export class DeployMainService implements IDeployMainService {
|
||||||
validatedIpcMain.on('kylinide.installWizard.init', async (event, msg) => {
|
validatedIpcMain.on('kylinide.installWizard.init', async (event, msg) => {
|
||||||
console.log("main on kylinide.installWizard.init");
|
console.log("main on kylinide.installWizard.init");
|
||||||
let selectPageShow = 0;
|
let selectPageShow = 0;
|
||||||
let message: string;
|
let message: string = "";
|
||||||
if (msg.type === "httpVerify") {
|
if (msg.type === "httpVerify") {
|
||||||
this.checkHttp().then(async res => {
|
this.checkHttp().then(async res => {
|
||||||
console.log("ipc main kylinide.installWizard.init httpVerify");
|
console.log("ipc main kylinide.installWizard.init httpVerify");
|
||||||
|
@ -275,7 +632,7 @@ export class DeployMainService implements IDeployMainService {
|
||||||
type: "error",
|
type: "error",
|
||||||
title: "配置文件检查",
|
title: "配置文件检查",
|
||||||
buttons: ["OK"],
|
buttons: ["OK"],
|
||||||
detail: `点击【OK】按钮后,将跳过此引导步骤,请根据开发需要自行下载插件、安装软件依赖。具体信息请查看日志${installConfig}/log/instguide.log`,
|
detail: `点击【OK】按钮后,将跳过此引导步骤,请根据开发需要自行下载插件、安装软件依赖。具体信息请查看日志${this.installConfig}/log/instguide.log`,
|
||||||
message: "安装引导器不支持当前系统。"
|
message: "安装引导器不支持当前系统。"
|
||||||
}).then(result => {
|
}).then(result => {
|
||||||
if (this.DeployWindow && this.DeployWindow != undefined)
|
if (this.DeployWindow && this.DeployWindow != undefined)
|
||||||
|
@ -289,7 +646,7 @@ export class DeployMainService implements IDeployMainService {
|
||||||
type: "error",
|
type: "error",
|
||||||
title: "配置文件检查",
|
title: "配置文件检查",
|
||||||
buttons: ["OK"],
|
buttons: ["OK"],
|
||||||
detail: `点击【OK】按钮后,将跳过此引导步骤,请根据开发需要自行下载插件、安装软件依赖。具体信息请查看日志${installConfig}/log/instguide.log`,
|
detail: `点击【OK】按钮后,将跳过此引导步骤,请根据开发需要自行下载插件、安装软件依赖。具体信息请查看日志${this.installConfig}/log/instguide.log`,
|
||||||
message: "本地数据及网络数据校验失败"
|
message: "本地数据及网络数据校验失败"
|
||||||
}).then(result => {
|
}).then(result => {
|
||||||
if (this.DeployWindow && this.DeployWindow != undefined)
|
if (this.DeployWindow && this.DeployWindow != undefined)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import * as os from 'os';
|
// import * as os from 'os';
|
||||||
import * as fs from 'fs';
|
// import * as fs from 'fs';
|
||||||
|
|
||||||
//获取全局变量g_index.json下载网络
|
//获取全局变量g_index.json下载网络
|
||||||
export function get_g_index_url() {
|
export function get_g_index_url() {
|
||||||
|
@ -9,9 +9,11 @@ export function get_g_index_url() {
|
||||||
|
|
||||||
export function configDir() {
|
export function configDir() {
|
||||||
// 获取用户目录
|
// 获取用户目录
|
||||||
|
const os = require('os');
|
||||||
|
const fs = require('fs');
|
||||||
const userHome = os.homedir();
|
const userHome = os.homedir();
|
||||||
// 创建日志目录
|
// 创建日志目录
|
||||||
const configDir = `${userHome}/.config/Kylin-IDE/installconfig`;
|
const configDir = `${userHome}/.config/Kylin-Code/installconfig`;
|
||||||
if (!fs.existsSync(configDir)) {
|
if (!fs.existsSync(configDir)) {
|
||||||
fs.mkdirSync(configDir, { recursive: true }); // 递归创建目录
|
fs.mkdirSync(configDir, { recursive: true }); // 递归创建目录
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue