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

Posted

技术标签:

【中文标题】使用自己的服务器(通用提供程序)设置电子自动更新程序【英文标题】:Electron auto updater setup with own server (generic provider) 【发布时间】:2020-02-18 01:43:33 【问题描述】:

我有自己的服务器,通过 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,如果有人已经下载了安装程序并在他的机器上安装了我的应用,我希望我的应用自动更新。

请告诉我到目前为止我所做的一切是否正常以及下一步是什么。我考虑如下:

在 package.json 中将 version 更改为 1.0.1 再次在终端运行构建命令 手动将新安装程序上传到我服务器上的同一位置

编辑

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

编辑 2

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

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

编辑 3

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


附加信息:

我的应用是使用 vue-electron v1.0.6 样板生成的。 我的电子更新版本是4.1.2 npm run build 实际上从 .electron-vue/build.js 中的样板代码中调用了一些代码,您可以在上面的链接中看到这个文件(例如,它将 NODE_ENV 设置为生产。package.json 中的脚本是:"build": "node .electron-vue/build.js && electron-builder",。 我不想在 github 上托管发布,因为我的存储库是私有的,我看到 some information in electron.build docs 我不应该这样做。 我还看到一些问题中的信息,我可以仅为发布创建新的存储库,但我认为将所有内容托管在我自己的服务器上是更干净的方法。

【问题讨论】:

这里有一个例子:github.com/iffy/electron-updater-example 涵盖“自定义”更新 那我做错了什么? 通过 cmd 运行打包的应用程序以查看日志,在问题中包含这些可能会有所帮助 我需要用证书签署应用程序才能正确运行自动更新吗? @dopeCode 不,自动更新应该在没有代码签名的情况下工作,如果您在终端中启动构建的 exe 后没有看到任何错误,请使用像 electron-log 这样的记录器给自动更新器一个记录器使用 (const logger = require("electron-log"); autoUpdater.logger = logger; logger.transports.file.level = "debug";) - 如果找到您的服务器以及是否找到更新,这应该打印出信息。如果您遇到错误,可以将其添加到您的问题中。 【参考方案1】:

我能够在文档之后使用 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

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

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

official docs 状态:

请勿致电setFeedURL。 electron-builder 在 resources 构建时自动为您创建 app-update.yml 文件(此文件是内部文件,您无需了解它)。

该 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 通知,通知您可用的更新和过程。

【讨论】:

我添加了记录器,现在我看到它实际上找到了新版本,它甚至显示需要下载多少 kb:Full: 151,317.35 KB, To download: 1,152.69 KB (1%) 但之后没有任何反应.. 应用程序没有更新。你确定checkForUpdatesAndNotify如果发现新版本就足以让应用退出然后下载新版本并安装它吗? 好吧,我再次添加了这个监听器,并在update-available 上记录了一些我可以看到的文本,但update-downloaded 从未发出,因为我看不到此事件的日志。它没有开始/完成(我什至不知道是哪一个)下载的原因可能是什么? checkForUpdatesAndNotify 应在下载成功后显示通知,然后在您关闭应用程序后更新。但是如果update-downloaded 事件永远不会触发,那么您就不会走那么远。但是,我很难说是什么导致了这个问题。 是的,这基本上是我的行为 update-available 发出但 update-downloaded 不是。我还不知道为什么。我会尝试重现它新的、空的存储库。 嗯,现在它开始工作了。虽然我没有更改单行代码。我只是等了一天,在那段时间也重新启动了PC。它正在工作,但正在下载完整的应用程序并记录错误:Cannot download differentially, fallback to full download: Error: Received data length 1527 is not equal to expected 634. 此外,它会在应用程序退出后尝试更新并请求管理员许可。如果我不允许,那么我可以使用以前的版本再次运行应用程序,这是我不想要的行为。我想强制用户安装更新。我正在使用 autoUpdater.quitAndInstall() 但它没有退出。

以上是关于使用自己的服务器(通用提供程序)设置电子自动更新程序的主要内容,如果未能解决你的问题,请参考以下文章

某些防病毒软件删除了自动更新程序文件

如何在捆绑电子应用程序之前对其进行编码(对于Mac)?

NoCredentialProviders:使用 AWS S3 的电子更新程序中的链错误中没有有效的提供者

Kotlin 使用协程处理改造请求

500错误,怎么解决

如何使用电子更新器自动更新电子应用程序?