来自 electron-builder 的 AppImage 文件系统不工作
AppImage from electron-builder with file system not working
我正在使用 electron builder 将我的 electron 应用程序编译为 .AppImage 文件,我正在使用 fs 模块写入 .json 文件,但它不能以 appimage 格式工作(当我工作时它工作正常有不是用 electron builder 制作的普通版本)。我仍然可以从文件中读取。
代码(预加载):
setSettings: (value) => {fs.writeFileSync(path.join(__dirname, "settings.json"), JSON.stringify(value), "utf8")}
代码(在网站上):
api.setSettings(settings);
项目:https://github.com/Nils75owo/crazyshit
这不是 AppImage 或 Electron Builder 的问题,而是您打包应用程序的方式的问题。由于您没有 post 您的 package.json
*,我只能猜测出了什么问题,但可能您没有更改 Electron Builder 关于打包应用程序的默认行为.
默认情况下,Electron Builder 将您的应用程序(包括所有资源)编译成一个 ASAR 格式的存档文件(可以将其视为 TAR 格式)。 Electron 包含 fs
模块的补丁版本,可以从 ASAR 文件中读取,但显然不支持写入。
您有两种选择来缓解此问题:要么将您的设置存储在用户目录中的某个位置(这是我要采用的方式,请参见下文),要么避免将您的应用程序打包到 ASAR 文件中,但是这会将所有 JavaScript 代码留在可执行文件之外的一个简单文件夹中。 (请注意,ASAR 无法对您的代码保密,因为有些应用程序可以提取此类档案,但这至少会使攻击者或好奇的眼睛更难获得您的代码副本。)
要禁用打包到 ASAR,只需告诉 Electron Builder 您不希望它编译存档。因此,在您的 package.json
中包括以下内容:
{
// ... other options
"build": {
// ... other build options
"asar": false
}
}
但是,正如我上面提到的,将设置存储在高级用户可以实际找到(并可能编辑,主要用于故障排除)的公共位置可能更明智。在 Linux 上,一个这样的文件夹是 ~/.config
,您可以在其中为您的应用程序创建一个子目录。
要获取跨平台的具体应用数据路径,可以在主进程中查询Electron的app
模块。您可以这样做:
const { app } = require ("electron"),
path = require ("path");
var configPath;
try {
configPath = path.join (app.getPath ("appData"), "your-app-name");
} catch (error) {
console.error (error);
app.quit ();
}
但是,如果您正确设置了应用程序的名称(通过使用 app.setName ("...");
),您可以简单地使用 app.getPath ("userData");
并省略路径连接。看看the documentation!
对于我的 Electron 应用程序,我通常选择将设置存储在用户主目录中的一个公共隐藏目录中(名称的一个示例可以是您计划营销该应用程序的品牌),然后我有单独的每个应用程序的目录。但是如何组织这完全取决于您。
* 对于未来,请不要将我们引导至 GitHub 存储库,而是包括 all replicate/understand 您问题中的问题所需的信息(代码也是信息)。这将为我们节省大量时间,并有可能让您更快得到答案。谢谢!