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

时间:2019-01-18 14:11:04

标签: javascript jquery node.js build electron


我目前正在使用NPM开发Electron-App,该应用程序将文件解压缩到所选目录。基本上是安装程序。现在,当我构建应用程序时,它仍然可以正常工作。我只是在win-packed文件夹中启动setup.exe,一切顺利进行。现在,当我将win-unpacked文件夹移动到另一个目录时,我的应用程序可以正常运行,但是当它开始解压缩过程时,它将引发以下错误:

enter image description here

我已经注意到,显示的第一个文件路径(由于某种原因)没有使用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文件,该文件将字符串传递给我的应用程序。这似乎是导致错误的模块。

我已经尝试解决几个小时了,但是我在网上找不到任何东西。我也找不到任何人遇到与我相同的错误。有关如何解决此问题的任何建议,将不胜感激。

问候
Matt.S

编辑:

我可能刚发现主要问题。绑定模块包含一个寻找模块根目录的函数。此路径显示在错误的第一行。但是,由于该应用程序已经构建完毕,因此所有源代码都在app.asar文件中。绑定似乎无法区分.asar文件和普通文件夹。因此,即使路径正确,它也不起作用。它之所以能在原始的Win-Unpacked中工作,是因为绑定(如果找不到模块根)会向上移动目录直到找到根。而且由于原始的win-unpacked文件夹位于我的项目目录中,因此绑定使用未构建的模块根目录。

1 个答案:

答案 0 :(得分:1)

我能够使用绑定模块重现此错误。

电子骨架似乎存在很多问题,可能会导致这种行为。

“根目录”问题

您通过对原始问题的修改自己回答了这个问题,但是为了提供完整的答案,我也将其包括在内

  

我只是在win-packed文件夹中启动setup.exe,一切顺利进行。现在,当我将win-unpacked文件夹移到另一个目录时,我的应用程序可以正常运行,但是在启动解压缩过程时会引发错误。

这有一个有趣的原因。由于您的 dist 目录(项目的构建目标)位于您的工作项目中,因此绑定模块假定您的工作目录根目录您的内置应用。因此,它能够解析模块的路径,并且一切正常。一旦将您构建的应用程序放置在其他位置,绑定模块将无法找到应用程序的根目录,并引发您链接的错误。

“ file://”问题

绑定模块的另一个问题是使用“文件”协议处理路径。

有人已经解决了这个问题,created an issue(+请求请求),因此即使我不鼓励采取这种措施,您也可以可以修改此模块的本地安装。

我的个人建议:

绑定模块的当前状态使其与Electron框架一起使用时没有吸引力。我听说它甚至在正确处理变音符号方面都存在问题,因此在特定情况下最好的选择就是摆脱它。您可以制作一个小的本地模块,该模块包装您的.node二进制文件,并使其与其他所有节点模块一样容易。

This is an amazing article about creating your own module.