TL;DR: 除了检查 AppImages、Windows Store 和 Mac App Store,您无法检测到您当前正在执行的二进制文件来自何处。 Linux 上所有包的可执行文件都是一样的,包只是它的容器。
除了process.windowsStore,还有用于Mac App Store 的process.mas。然而,在 Linux 上,可执行文件的来源(即它是如何安装的)的信息会丢失。这是因为所有包格式(Debian 包、RedHat 包、Snaps 等)本质上归结为一个存档,安装程序(dpkg、rpm、snap 等)将其提取到一个某个位置。只有那些程序会跟踪哪些文件属于哪个包。
如果您以可安装包的方式提供您的应用程序,而不仅仅是简单的 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
}
}
但是请注意,这也不能保证,因为任何用户都可以在运行任何可执行文件之前设置环境变量。该测试使误报的可能性大大降低。