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

Posted

技术标签:

【中文标题】在运行的应用程序中查看 electron-builder 的构建目标【英文标题】:See build target of electron-builder in running application 【发布时间】:2021-07-02 14:22:20 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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
    

但是,这并不能保证 - 操作系统、桌面环境等可能会执行一些您无法检测到的技巧(例如,将 AppImage 提取到这样的目标)。另外,不要单独测试/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
   

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

【讨论】:

唯一支持应用程序代码自动更新的 Linux 目标是 AppImages。与其他打包格式一样,快照会在外部自动更新。任何想法如何检测 AppImages?作为替代方案,我考虑修改构建过程以在二进制文件中包含某种标志,指示它是为哪个目标构建的。 好吧,从技术上讲,普通 tarball 也支持应用内更新,而不仅仅是 AppImages。在这些方面,我的信息太少,无法提供帮助。 (也许有一些环境变量?我会检查......)但是,正如我在答案中所写,我不相信 Electron Builder 会为每个目标重新构建可执行文件,而是一遍又一遍地重用相同的二进制文件,只需将其复制到不同的档案中。除此之外的一切都太低效了。因此,如果这个编译时标志方法可行,我会感到惊讶(这就是我没有将它包含在答案中的原因)。 @SebastianR 我已经更新了答案,我的猜测是正确的,环境变量在检测 AppImage 运行时会有所帮助。

以上是关于在运行的应用程序中查看 electron-builder 的构建目标的主要内容,如果未能解决你的问题,请参考以下文章

如何在Linux中查看所有正在运行的进程

Mac系统怎么查看正在运行中的应用程序

如何在Linux中查看所有正在运行的进程

如何查看电脑后台正在运行的程序

如何在Linux中查看所有正在运行的进程

win10怎么查看正在运行的程序