node.js - electronic-packager并未使用它 package 我的目录之一。有任何解决这个问题的方法吗?

标签 node.js electron electron-packager

因此,我最近正在使用Electron.js,并且打包了一些应用程序。今天,我决定弄乱文件的保存和加载等,并且我得到了一个非常可靠的GUI,用于保存,读取,编辑和删除文本文件。它的工作方式是将所有文件写入源代码中的/saves/目录,然后从同一位置读取。在使用electron .运行时,它可以完美运行,所以我知道问题不在我的代码中(因此,我什至不在这里包括我的代码,因为我知道问题所在,并且我知道这与问题无关我的代码)
这里的问题是,当我使用electron-packager . electron-tutorial-app --overwrite --asar --platform=win32 --arch=ia32 --icon=assets/icons/win/icon.ico --prune=true --out=release-builds --version-string.CompanyName=CE --version-string.FileDescription=CE --version-string.ProductName=\"Electron Tutorial App\"打包我的代码并运行输出的.exe文件时,出现以下错误:Error: ENOENT: no such file or directory, scandir 'saves'当检查打包的文件时,实际上我的/saves/目录丢失了。它没有与应用程序的其余部分打包在一起,现在无法找到。如果我使用.exe文件在文件夹内手动创建/saves/目录,则可以正常工作...
所以我想知道的是,有没有一种方法可以告诉electronic-packager将/saves/目录与项目的其余部分一起打包?是否需要我在命令中添加标志,或者更改我的package.json
这是我的package.json:

{
    "name": "reading-and-writing-files",
    "version": "1.0.0",
    "description": "",
    "main": "main.js",
    "scripts": {
        "start": "electron .",
        "package-win": "electron-packager . electron-tutorial-app --overwrite --asar --platform=win32 --arch=ia32 --icon=assets/icons/win/icon.ico --prune=true --out=release-builds --version-string.CompanyName=CE --version-string.FileDescription=CE --version-string.ProductName=\"Reading and Writing Files\""
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "electron": "11.2.0",
        "electron-packager": "^15.2.0"
    }
}

最佳答案

通过在--asar脚本中使用package-win开关,您可以告诉Electron Packager将应用程序的所有源代码(包括任何目录)写入Asar归档文件。这是一个类似TAR的存档文件,位于构建目录中的resources/app.asar下(对于您而言,完整路径为release-builds/<your app name and plattform>/resources/app.asar)。您的应用程序可以正常运行,因为Electron会为您处理从存档中加载文件。
但是,由于这是一个归档文件,因此您不能简单地向其中写入文件,并且似乎您是在自己构造/saves/目录的路径,而不是使用__dirname指向该Asar归档文件。
话虽这么说,一种可能的解决方法是根本不使用Asar(通过从--asar脚本中删除package-win开关),这将使您的应用程序源几乎不 protected ,或者通过检查saves/目录是否存在并创建如果不是在应用启动时进行的话,这似乎是可行的方法。
为此,请将以下代码添加到主进程的文件中的任何位置,以main.js为例(我建议将此代码放在顶部附近):

const fs = require ("fs"),
      { app } = require ("electron"); // Remove if already loaded

if (__dirname.includes (".asar")) {                            // (1)
    var exePath = app.getPath ("exe"),                         // (2)
        splitPath = exePath.replace (/\\/g, "/").split (/\//); // (3)
    
    splitPath.pop ();                                          // (4)
    exePath = splitPath.join ("/");                            // (5)
    
    var savesPath = exePath + "/path/to/saves";                // (6)
    if (!fs.existsSync (savesPath)) {
        fs.mkdirSync (savesPath);
    }
}
说明:在执行任何操作(1)之前,我们通过检查当前文件的路径是否包含“.asar”来检查我们是否正在生产中(即,不在Asar归档文件中)。然后,我们要求Electron将路径返回到当前的可执行文件(2)。这可用于确定saves目录的所需路径。在(3)中,我们删除了可能在Windows上出现的所有反斜杠,并用正斜杠替换了它们以确保跨平台兼容性,并用那些斜杠分割了字符串,因此我们得到了一系列路径段(即目录)。然后,我们从该数组中删除最后一个元素,因为这将是Windows上.exe的名称,或者在Linux或macOS上只是可执行文件的名称(4)。然后,我们在(5)中使用正斜杠再次加入数组。然后可以将其用作基本路径。在(6)中,我们最终构造了saves目录的路径。请注意,该路径将相对于您的可执行文件(在Windows上.exe),因此,如果您希望目录直接与可执行文件位于同一目录中,则使用/saves而不是/path/to/saves就足够了。如果不存在这样的路径,则您的应用程序将创建目录。
但是请注意,此方法有一些警告:如果路径存在但不是文件夹,则您的应用程序将不会尝试创建目录,因为它不会检查现有路径是目录还是文件还是...。但是这样做时,您将必须删除此“违规”路径,对于包括我在内的某些人,这是一种不良做法,因为您不知道文件的内容对您的用户或对用户是否有值(value)。不是。

关于node.js - electronic-packager并未使用它 package 我的目录之一。有任何解决这个问题的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65746563/

相关文章:

node.js - npm install 给出错误 : EPERM, 取消链接

javascript - 如何创建 string 或 null 类型的 JSON Schema 属性

javascript - 修改req.body和res。 Node.Js/Express 应用程序中的参数

javascript - 导出的 Electron APP 在 MacOS 上不起作用

node.js - 如何获得使用 Node fs创建文件/目录的权限

vue.js - 如何将哈巴狗与 Electron 战配合使用?

node.js - 在 Windows 10 上使用 Opencv4nodejs 构建 Electron 应用程序的问题

调用文件的任何地方的 node.js 意外标识符

javascript - 在 Electron 中获取渲染器进程 ID

electron - 使用 Electron 构建器时如何将参数传递给 Electron ?