移动构建文件夹时电子应用程序错误

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.

【讨论】:

以上是关于移动构建文件夹时电子应用程序错误的主要内容,如果未能解决你的问题,请参考以下文章

tsc 不移动 html 资源

Kivy buildozer.spec 错误 - 尝试构建一个发送电子邮件的 android 应用程序

构建后运行电子应用程序时出错

使用电子生成器构建电子时如何排除文件?

CFBundleIdentifier在上传使用Electron开发并使用电子构建器构建的macOS应用程序时发生冲突

使用电子生成器构建后,电子应用程序未加载 index.html,甚至没有给出错误