移动构建文件夹时电子应用程序错误
Posted
技术标签:
【中文标题】移动构建文件夹时电子应用程序错误【英文标题】:Electron app Error when moving build folder 【发布时间】:2019-06-12 19:43:15 【问题描述】:我目前正在使用 NPM 开发一个 Electron-App,它将文件解压缩到选定的目录。基本上是安装程序。现在,当我构建应用程序时,它仍然可以正常工作。我只需在我的 win-unpacked 文件夹中启动 setup.exe,一切都会顺利进行。现在,当我将 win-unpacked 文件夹移动到另一个目录时,我的应用程序运行良好,但是当它开始解压缩过程时,它会引发以下错误:
我注意到,显示的第一个文件路径(出于某种原因)不使用 utf8,但所有其他文件路径都正确显示(应该是 ä)。此外,我已经尝试删除 node_modules 文件夹,然后运行 npm i 重新安装它们。仍然有同样的问题。
以下是开始解压过程的代码:
const path = require('path');
const ipcRenderer = require('electron').ipcRenderer;
const Unzip = require('./unzip');
const os = require('os');
const fs = require('fs');
$('#information_next').click(function ()
var extractPath = $('#input_select').val();
let filepath;
const platform = os.platform();
const nodeName = platform == 'win32' ? 'wcd.node' : (platform == 'darwin' ? 'mcd.node' : 'lcd.node');
let customData = require("bindings")(nodeName);
let zip = h2a(customData.customData());
if(os.platform() == 'darwin')
filepath = path.join(__dirname, '..', '..', '..', '..', 'ZIP.zip');
else
filepath = path.join(__dirname, '..', '..', 'ZIP.zip');
var xPath = path.join.apply(null, extractPath.split('\\'));
var unzip = new Unzip(filepath, xPath.toString());
unzip.extract(extractPath, zip, 100, (percentage) =>
// Code for Progressbar
finish = true;
setTimeout(function ()
$('.main_wrapper').addClass('hidden');
$('.main7').removeClass('hidden');
, 1500);
).catch((e) =>
$('.main6').addClass('hidden');
$('.main_install_error').prop('hidden', false);
);
);
这里我使用bindings 模块来要求一个.node 文件,该文件将一个字符串传递给我的应用程序。这似乎是导致错误的模块。
我已经尝试解决这个问题好几个小时了,但我在网上找不到任何东西。我也找不到与我有相同错误的人。任何有关如何解决此问题的建议将不胜感激。
问候 马特.S
编辑:
我可能刚刚发现了主要问题。 bindings 模块包含一个查找模块根目录的函数。此路径显示在 ERROR 的第一行。然而,由于这个应用程序已经构建完成,所有的源代码都在 app.asar 文件中。绑定似乎无法区分 .asar 文件和普通文件夹。所以即使路径是正确的,它也行不通。它在原始 win-unpacked 中工作的原因是绑定(如果它找不到模块根目录)向上移动通过目录直到找到根目录。由于原始的 win-unpacked 文件夹在我的项目目录中,因此绑定使用未构建的模块根目录。
【问题讨论】:
【参考方案1】:我能够使用绑定模块重现此错误。
电子框架似乎有很多问题会导致这种行为。
“根目录”问题
您自己通过编辑原始问题回答了这个问题,但为了提供完整的答案,我也将其包括在内
我只需在我的 win-unpacked 文件夹中启动 setup.exe,一切都会顺利进行。现在,当我将 win-unpacked 文件夹移动到另一个目录时,我的应用程序运行良好,但是当它开始解压缩过程时,它会引发错误。
这有一个有趣的原因。由于您的 dist 目录(项目的构建目标)在您的工作项目中,绑定模块假定您的 工作目录 是 根目录您构建的应用。因此,它能够解析模块的路径,并且一切正常。一旦您构建的应用程序被放置在其他地方,绑定模块将无法找到您的应用程序的根目录并引发您链接的错误。
'file://'问题
绑定模块的另一个问题是使用“文件”协议处理路径。
已经有人提出并created an issue(+ 一个拉取请求)解决了这个问题,所以你可以修改你本地安装的这个模块,即使我不鼓励采取这样的行动。 p>
我的个人建议:
绑定模块的当前状态使其与 Electron 框架一起使用没有吸引力。我听说它甚至无法正确处理变音符号,因此在您的具体情况下,最好的选择是摆脱它。你可以制作一个小型的本地模块来包装你的 .node 二进制文件,让它像你所有的其他节点模块一样容易被要求。
This is an amazing article about creating your own module.
【讨论】:
以上是关于移动构建文件夹时电子应用程序错误的主要内容,如果未能解决你的问题,请参考以下文章
Kivy buildozer.spec 错误 - 尝试构建一个发送电子邮件的 android 应用程序