使用自己的服务器(通用提供商)设置电子自动更新程序

Electron auto updater setup with own server (generic provider)

我有自己的服务器,我通过 FTP 上传了应用程序安装程序。它的名称是 quickmargo Setup 1.0.0.exe,可在

获得

https://quickmargo.pl/dist/download/quickmargo 安装程序 1.0.0.exe

我也通过 FTP 将 latest.yml 上传到同一目录,可在

https://quickmargo.pl/dist/download/latest.yml

在我的项目中index.js我有

import { autoUpdater } from 'electron-updater'

autoUpdater.setFeedURL('https://quickmargo.pl/dist/download');

autoUpdater.on('update-downloaded', () => {
    autoUpdater.quitAndInstall()
});

autoUpdater.on('update-available', (ev, info) => {
    alert('Update required!');
});

app.on('ready', async () => {
    if (process.env.NODE_ENV === 'production') {
        await autoUpdater.checkForUpdates()
    }
});

在 package.json 我有 "version": "1.0.0",build:{} 我有:

"win": {
  "icon": "build/icons/icon.ico",
  "publish": [{
    "provider": "generic",
    "url": "https://quickmargo.pl/dist/download"
  }]
},

(我不关心其他平台)

现在假设我对我的应用程序做了一些更改,我想上传 1.0.1 版,如果有人已经下载了安装程序并在他的机器上安装了我的应用程序,我希望我的应用程序自动更新。

请告诉我到目前为止我所做的一切是否都很好,下一步是什么。我考虑如下:

编辑

我做了以上三个步骤加上我还上传了新的 latest.yml(版本 1.0.1),结果是当我现在 运行 以前安装的(在将新版本上传到服务器之前)版本1.0.0 在其他 PC 上然后它没有检测到我将 1.0.1 添加到服务器并且它没有更新或显示一些弹出窗口或任何东西。我做错了什么?

编辑 2

我正在尝试自己解决它,现在我上传了 1.0.2 所以现在 link 下载应用程序是:

https://quickmargo.pl/dist/download/quickmargo 安装程序 1.0.2.exe

编辑 3

我试图自己解决它我在 index.js 中编辑了代码。我也在上面编辑过。 alert('Update required!'); update-available 事件从未发生。它应该向我显示警报未定义的错误消息 window。但显然 update-available 事件从未发出。


附加信息:

我能够按照文档使用 generic 发布选项设置自动更新配置,之前从未这样做过。所以它绝对可行,并且不需要通过证书签名,但我最初遇到问题是因为我在构建配置中设置了 publisherName,但没有证书。如果当前版本指定了发布者或证书,而新版本没有,则也不会安装。

1.启用日志记录

您可以通过安装 electron-log 然后将记录器分配给 autoUpdater:

来启用 electron-updater 包的日志记录
const log = require('electron-log');
autoUpdater.logger = log;
autoUpdater.logger.transports.file.level = 'info';

默认输出路径为:

  • Linux: ~/.config/<app name>/log.log
  • macOS: ~/Library/Logs/<app name>/log.log
  • Windows: %USERPROFILE%\AppData\Roaming\<app name>\log.log

如果以下步骤不能解决您的问题,请post日志内容。

2。不要打电话 autoUpdater.setFeedURL()

official docs状态:

Do not call setFeedURL. electron-builder automatically creates app-update.yml file for you on build in the resources (this file is internal, you don’t need to be aware of it).

URL 已在您的 publish 提供程序对象中定义,这足以让更新程序使用。此外,作为 setFeedURL() 参数的 URL 字符串不正确,it should be an options object。但同样,在您的 publish 提供商中指定所有内容就足够了。

3。同时将 .blockmap 文件上传到您的服务器

除了您的设置 .exe 文件之外,这些应该在构建时创建。否则,您将在日志中看到无法找到新旧版本文件进行比较的错误。

4.向更新服务器添加尾部斜线 URL

确保提供程序对象的 url 参数以斜杠结尾。虽然 yml 文件在没有它的情况下仍然可以找到,但在实际下载过程中可能会出现问题。

5.使用 autoUpdater.checkForUpdatesAndNotify()

尝试更简单的方法

与其使用更灵活但也更复杂的方式来监听不同的更新事件并在您的应用程序中对它们做出反应,不如先尝试使用以下代码使其工作。一旦成功,您仍然可以返回处理不同的事件以获得更好的用户体验。

app.on('ready', async () => {
  autoUpdater.checkForUpdatesAndNotify();
});

这将在后台检查并下载更新,并在您关闭应用后立即自动安装。默认 Windows 通知将弹出,通知您有关可用更新和程序的信息。

这里想介绍一下https://github.com/electron-delta/electron-delta-updater

它使用二进制差异方法生成非常小的增量文件来更新您的应用程序,而不是旧的块映射方法。

npm install @electron-delta/updater
const DeltaUpdater = require("@electron-delta/updater");
const { app, BrowserWindow } = require("electron");

app.whenReady().then(async () => {

  const deltaUpdater = new DeltaUpdater({
    logger: require('electron-log'),
    // optionally set the autoUpdater from electron-updater
    autoUpdater: require("electron-updater").autoUpdater,
    // Where delta.json is hosted, for github provider it's not required to set the hostURL
    hostURL: "https://example.com/updates/windows/",
  });

  try {
    await deltaUpdater.boot();
  } catch (error) {
    logger.error(error);
  }
  // create main app window after the deltaUpdater.boot()
  createMainWindow();

});