在 运行 应用程序中查看 electron-builder 的构建目标

See build target of electron-builder in running application

我使用 electron-builder 创建我的 Electron 应用程序的分发包。我的应用程序为用户提供了禁用(和启用)电子生成器中包含的自动更新的选项。我不想在自动更新一开始就不起作用的情况下提供这种选择(例如 Windows Store、Linux Snaps、Linux deb packages 等)

我看到 Electron 有 属性 process.windowStore,这至少可以帮助我找到一个构建目标。我如何找到 Electron 应用程序在 Linux 中运行的构建目标,以便我可以隐藏禁用自动更新的选项?

TL;DR: 除了检查 AppImages、Windows Store 和 Mac App Store,您无法检测到您的二进制文件当前所在的位置执行来自。 Linux 上的所有包的可执行文件都是相同的,包只是它的容器。


除了 process.windowsStore,Mac App Store 还有 process.mas。然而,在 Linux 上,可执行文件的来源信息(即它是如何安装的)丢失了。这是因为所有包格式(Debian 包、RedHat 包、Snaps 等)本质上都归结为安装程序(dpkgrpmsnap、等)提取到某个位置。只有那些程序会跟踪哪些文件属于哪个包。

如果您以可安装包的方式提供您的应用程序,而不仅仅是简单的 tarball,您可能必须禁用所有 Linux 构建的自动更新。但是,可能值得在运行时检查可执行文件当前是否从受限目录(例如 /bin/usr/lib/lib64 等)运行——这可能表明用户使用软件包安装了应用程序:

// in the main process
if (process.platform === "linux") {
    var disableAutoUpdate = false;
    var restrictedDirs = [ "/bin", "/usr", "/lib", "/lib64" /* ... others to your liking ... */ ];
    for (var i = 0; i < restrictedDirs.length; i++) {
        if (__dirname.startsWith (restrictedDirs [i])) disableAutoUpdate = true;
    }
    if (disableAutoUpdate) {
        // your logic
    }
}

然而,这并不能保证 -- OS、桌面环境等可能会做一些您无法检测到的技巧(例如,将 AppImages 提取到这样的目的地)。此外,不要 单独测试 /home(或者就此而言,/root),因为压缩包可以在任何地方提取。这包括不受保护的用户拥有的目录,不是软件包安装程序的安装目标,并且不在 /home 之下而是在 /mnt/run

在测试 AppImages 时还有另一种方法(可能有效)。根据 AppImage documentation,环境变量 APPIMAGE(以及其他变量)将设置为可执行文件的完整路径。因此,您可以将自动更新检查重写为以下内容:

if (process.platform === "linux") {
   var disableAutoUpdate = true;
   // maybe do some other checks...
   if (process.env.APPIMAGE) disableAutoUpdate = false;
   if (disableAutoUpdate) {
       // your logic
   }
}

但是请注意,这也不能保证,因为任何用户都可以在 运行 任何可执行文件之前设置环境变量。该测试降低了误报的可能性。