我做了一个电子应用程序来管理一些简单的NeDB数据库。当从VS Code启动时,一切都完美地工作,没有错误,也没有奇怪的事情发生。问题来后,我运行npm run package
,它创建输出文件夹,因为它应该,但如果我移动该文件夹到网络路径,并运行.exe它打开,保持空了几秒钟,然后关闭没有任何错误。
我检查了文件夹权限(即使我创建了它并完全控制了它)。然后,我试着在我的电脑上运行output.exe,它工作得很好,我还把它复制到另一台电脑上,它也在那里工作。
另一个奇怪的事情是,它崩溃后,我试图删除文件夹,我得到一个消息,有些文件不能删除,由于他们正在使用的另一个程序,所以为了删除文件夹,我必须重新启动我的电脑,因为没有什么在任务管理器杀死.
这是我的package.json
{
"name": "gestione-marcature-laser",
"version": "2.0.0",
"description": "Gestore Marcature Laser",
"main": "index.js",
"scripts": {
"start": "electron-forge start",
"package": "electron-forge package",
"make": "electron-forge make"
},
"author": "Nemanja G.",
"license": "ISC",
"dependencies": {
"bcryptjs": "^2.4.3",
"electron-prompt": "^1.7.0",
"electron-squirrel-startup": "^1.0.0",
"jquery": "^3.5.1",
"moment": "^2.29.1",
"nedb-async": "^0.1.6",
"select2": "^4.0.13",
"xlsx": "^0.16.9"
},
"devDependencies": {
"@electron-forge/cli": "^6.2.1",
"@electron-forge/maker-deb": "^6.2.1",
"@electron-forge/maker-rpm": "^6.2.1",
"@electron-forge/maker-squirrel": "^6.2.1",
"@electron-forge/maker-zip": "^6.2.1",
"@electron-forge/plugin-auto-unpack-natives": "^6.2.1",
"electron": "^25.2.0"
}
}
字符串
这是我的forge.config.js
const path = require('path')
module.exports = {
packagerConfig: {
icon: './assets/logo',
asar: {
//unpack: "**/node_modules/pdf-to-printer/**/*"
},
out: "gestione-marcature"
},
rebuildConfig: {},
makers: [
{
name: '@electron-forge/maker-squirrel',
config: {
iconUrl: path.resolve(__dirname, './assets/logo.ico'),
setupIcon: path.resolve(__dirname, './assets/logo.ico'),
},
},
{
name: '@electron-forge/maker-zip',
platforms: ['darwin'],
},
{
name: '@electron-forge/maker-deb',
config: {
icon: './Styles/static/icon.png',
},
},
{
name: '@electron-forge/maker-rpm',
config: {},
},
],
plugins: [
{
name: '@electron-forge/plugin-auto-unpack-natives',
config: {},
},
]
};
型
我的main.js
const { app, BrowserWindow, dialog } = require('electron');
const path = require('path');
const url = require('url');
const { ipcMain } = require('electron');
const bcrypt = require('bcryptjs');
const prompt = require('electron-prompt');
/* SEZIONE PASSWORD, attualmente quella di sap. Usare codice sotto per generare hash */
/*
const password = "PASS"
const saltRounds = 10
bcrypt.genSalt(saltRounds, function (err, salt) {
if (err) {
throw err
} else {
bcrypt.hash(password, salt, function (err, hash) {
if (err) {
throw err
} else {
console.log(hash);
dialog.showErrorBox('Errore', hash);
//$2a$10$FEBywZh8u9M0Cec/0mWep.1kXrwKeiWDba6tdKvDfEBjyePJnDT7K
}
})
}
})
*/
//hash = "$2b$10$6OT.h/W3EnHAxiRC15OfR.BdEseDilja8m5Z2LPtEeed3pNYNsJwO";
hash = "$2b$10$OMZlnwGs8av1Kwhbx5ya5uUU2HMCdU.Gyn//s0.J2/mSklzoBEjny";
let win = null;
let win2 = null;
function createWindow() {
// Create the browser window.
win = new BrowserWindow({
width: 1000,
height: 720,
webPreferences: {
nodeIntegration: true,
preload: path.join(__dirname, 'preload.js')
},
icon: path.join(__dirname, './assets/logo.png'),
show: false
});
// maximize it
win.maximize();
// and load the index.html of the app.
win.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true
}));
win.once('ready-to-show', () => {
win.show()
});
win.on("close", (evt) => {
//Cancel the current event to prevent window from closing
//options object for dialog.showMessageBox(...)
let options = {
type: "question",
buttons: ["&Sì", "&No", "&Cancella"],
defaultId: 2,
title: "Attenzione!",
message: "Confermi la chiusura del programma Gestione Database Marcature?",
detail: "Potrai riaprirlo dall'icona nel desktop.",
icon: path.join(__dirname, './assets/logo.png'),
cancelId: 2,
noLink: true,
normalizeAccessKeys: true
};
let res = dialog.showMessageBoxSync(win, options);
if (res === 0) {
//Yes button pressed
} else if (res === 1) {
//No button pressed
evt.preventDefault();
} else if (res === 2) {
//Cancel button pressed
evt.preventDefault();
}
});
// Open the DevTools.
win.removeMenu();
//win.webContents.openDevTools();
}
ipcMain.on('openPage', async (_, arg) => {
if (!win2) {
let pwd = await prompt({
title: 'Attenzione!',
label: 'Inserire la password:',
type: 'input',
height: 200,
inputAttrs: { type: 'password', required: true },
icon: path.join(__dirname, './assets/logo.png'),
menuBarVisible: false,
buttonLabels: 'ok',
customStylesheet: path.join(__dirname, 'styles', 'prompt-styles.css')
});
bcrypt.compare(pwd, hash).then(res => {
if (res) {
win2 = new BrowserWindow({
parent: win,
webPreferences: {
nodeIntegration: true,
preload: path.join(__dirname, 'preload.js')
},
frame: false,
width: 1000,
height: 720,
show: false
});
win2.maximize();
win2.loadURL(url.format({
pathname: path.join(__dirname, arg.page),
protocol: 'file:',
slashes: true
}));
win2.once('ready-to-show', () => {
win2.show()
});
win2.on('close', _ => { win2 = null });
//win2.webContents.openDevTools();
} else {
dialog.showErrorBox('Errore', 'Password non corretta!');
}
});
}
});
ipcMain.on('closePage', _ => {
win2.close();
});
ipcMain.on('showMessageBox', (_, arg) => {
dialog.showMessageBox({
title: arg.title,
message: arg.message
})
});
const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) {
app.quit();
} else {
app.on('second-instance', (event, commandLine, workingDirectory) => {
// Someone tried to run a second instance, we should focus our window.
if (win) {
if (win.isMinimized()) {
win.restore();
}
win.focus();
}
})
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(createWindow);
// Quit when all windows are closed.
app.on('window-all-closed', () => {
// On macOS it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== 'darwin') {
app.quit();
}
});
}
型
* 编辑 *
我尝试了几件事:
1.我使用电子锻造网站(https://www.electronforge.io/)上的npm init electron-app@latest my-app
创建了另一个应用程序。
1.然后我运行npm run make
,把.exe放在网络路径中,仍然是同样的问题。
1.为了确保这不是一个问题,我们的服务器,我共享文件夹到另一台计算机,并试图运行.exe和.同一问题
似乎有一些错误试图运行电子可执行文件从一个共享文件夹,但似乎不能找出原因
* 编辑2 *
尝试从终端启动应用程序,这是输出:
[9836:0726/160545.734:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.780:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.788:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.794:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.799:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.809:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.814:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.819:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.825:ERROR:gpu_process_host.cc(948)] GPU process launch failed: error_code=18
[9836:0726/160545.825:FATAL:gpu_data_manager_impl_private.cc(431)] GPU process isn't usable. Goodbye.
型
3条答案
按热度按时间gg0vcinb1#
Electron.js在打包时生成的包含所有应用程序文件和资源的文件夹不用于移动和使用。它被
electron-forge
打包器使用。无论如何,您可以使用
electron-builder
将应用打包为可移植的.exe
,其中-p
标志用于可移植文件,--win
标志用于Windows可执行文件:字符串
要使用此模块,您需要设置some things,例如发布提供程序和更新详细信息。
--win
flag还有两个替代选项:--mac
for MacOS--linux
for Linuxp4rjhz4m2#
而不是
electron-forge package
用途:字符串
为什么?
package
命令不支持的forge.config.js
文件package
更多的CLI标志(选项nnsrf1az3#
如果您的应用程序没有将任何错误记录到终端/控制台,则可能意味着
gotTheLock
变量在共享文件夹上是错误的。由于this issue,Electon无法正确退出。在调用app.quit()
之前,您需要删除所有BrowserWindow
示例上的事件侦听器(如close
),以使其正确退出。