electron-packager 没有用它打包我的目录之一。有任何解决这个问题的方法吗?
electron-packager is not packaging one of my directories with it. Any way to fix this?
所以,我最近在使用 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/
目录,那么它工作得很好...
所以我想知道的是,有没有办法告诉 electron-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"
}
}
通过在 package-win
脚本中使用 --asar
开关,您告诉 Electron Packager 将您应用程序的所有源代码(包括任何目录)写入 Asar 存档。这是一个类似于 TAR 的存档文件,位于您的构建目录中的 resources/app.asar
下(在您的情况下,完整路径将是 release-builds/<your app name and plattform>/resources/app.asar
)。你的应用程序将 运行 关闭它就好了,因为 Electron 会为你处理从存档中加载文件。
但是,由于这是一个存档,您不能简单地向其中写入文件,而且您似乎是在自己构建 /saves/
目录的路径,而不是使用 __dirname
,这将指向 Asar 档案。
也就是说,一种可能的解决方法是根本不使用 Asar(通过从 package-win
脚本中删除 --asar
开关),这将使您的应用程序的源代码几乎不受保护好奇的眼睛,或者通过检查 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) 之前,我们检查我们是否在生产环境中 运行ning(即关闭 Asar 存档),方法是检查当前文件的路径包括“.asar”。然后,我们要求 Electron return 当前可执行文件的路径 (2)。这可用于确定 saves
目录的所需路径。在 (3) 中,我们删除了可能出现在 Windows 上的所有反斜杠,并将它们替换为正斜杠以确保跨平台兼容性,并将字符串拆分为那些,以便我们得到一组路径段(即目录)。然后,我们从该数组中删除最后一个元素,因为这将是您在 Windows 上的 .exe
的名称,或者在 Linux 或 macOS (4) 上只是可执行文件的名称。然后,我们在 (5) 中使用正斜杠再次加入数组。然后可以将其用作基本路径。在(6)中,我们最终构建了saves
目录的路径。请注意,此路径将相对于您的可执行文件(在 Windows .exe
上),因此如果您希望目录直接驻留,则使用 /saves
而不是 /path/to/saves
就足够了在与您的可执行文件相同的目录中。如果不存在这样的路径,您的应用将创建该目录。
但请注意,此方法有一些注意事项:如果路径存在,但不是文件夹,您的应用将不会尝试创建目录,因为它不会检查现有路径是目录还是目录文件或...但是在这样做时,您将不得不删除这个“有问题的”路径,包括我在内的一些人认为这是一种不好的做法,因为您不知道文件的内容是否是对您的用户是否有价值。
所以,我最近在使用 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/
目录,那么它工作得很好...
所以我想知道的是,有没有办法告诉 electron-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"
}
}
通过在 package-win
脚本中使用 --asar
开关,您告诉 Electron Packager 将您应用程序的所有源代码(包括任何目录)写入 Asar 存档。这是一个类似于 TAR 的存档文件,位于您的构建目录中的 resources/app.asar
下(在您的情况下,完整路径将是 release-builds/<your app name and plattform>/resources/app.asar
)。你的应用程序将 运行 关闭它就好了,因为 Electron 会为你处理从存档中加载文件。
但是,由于这是一个存档,您不能简单地向其中写入文件,而且您似乎是在自己构建 /saves/
目录的路径,而不是使用 __dirname
,这将指向 Asar 档案。
也就是说,一种可能的解决方法是根本不使用 Asar(通过从 package-win
脚本中删除 --asar
开关),这将使您的应用程序的源代码几乎不受保护好奇的眼睛,或者通过检查 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) 之前,我们检查我们是否在生产环境中 运行ning(即关闭 Asar 存档),方法是检查当前文件的路径包括“.asar”。然后,我们要求 Electron return 当前可执行文件的路径 (2)。这可用于确定 saves
目录的所需路径。在 (3) 中,我们删除了可能出现在 Windows 上的所有反斜杠,并将它们替换为正斜杠以确保跨平台兼容性,并将字符串拆分为那些,以便我们得到一组路径段(即目录)。然后,我们从该数组中删除最后一个元素,因为这将是您在 Windows 上的 .exe
的名称,或者在 Linux 或 macOS (4) 上只是可执行文件的名称。然后,我们在 (5) 中使用正斜杠再次加入数组。然后可以将其用作基本路径。在(6)中,我们最终构建了saves
目录的路径。请注意,此路径将相对于您的可执行文件(在 Windows .exe
上),因此如果您希望目录直接驻留,则使用 /saves
而不是 /path/to/saves
就足够了在与您的可执行文件相同的目录中。如果不存在这样的路径,您的应用将创建该目录。
但请注意,此方法有一些注意事项:如果路径存在,但不是文件夹,您的应用将不会尝试创建目录,因为它不会检查现有路径是目录还是目录文件或...但是在这样做时,您将不得不删除这个“有问题的”路径,包括我在内的一些人认为这是一种不好的做法,因为您不知道文件的内容是否是对您的用户是否有价值。