独自のサーバー(汎用プロバイダー)を使用したElectron自動アップデーターのセットアップ


8

FTP経由でアプリインストーラーをアップロードしたサーバーがあります。その名前はでquickmargo Setup 1.0.0.exeあり、それはで利用可能です

https://quickmargo.pl/dist/download/quickmargo Setup 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をアップロードしたいとします。誰かがすでにインストーラーをダウンロードして自分のマシンにアプリをインストールした場合、アプリを自動更新したいとします。

これまでに作成したものすべてが問題なく、次のステップが何かあれば教えてください。私は以下を検討します:

  • 変更version1.0.1package.jsonで
  • ターミナルでビルドコマンドを再度実行する
  • 新しいインストーラーをサーバーの同じ場所に手動でアップロードする

編集する

上記の3つのステップを実行し、新しいlatest.yml(バージョン1.0.1を使用)もアップロードしました。その結果、以前にインストールされた(新しいバージョンをサーバーにアップロードする前に)バージョン1.0.0を他のPCで実行した場合、実行されません。サーバーに1.0.1を追加したことを検出します。サーバーが更新されないか、ポップアップなどが表示されません。私は何を間違っていますか?

編集2

私はそれを自分で解決しようとしています、そして今私は1.0.2をアップロードしたので、アプリをダウンロードするためのリンクは次のとおりです:

https://quickmargo.pl/dist/download/quickmargo Setup 1.0.2.exe

編集3

index.jsでコードを編集した自分で解決しようとしていました。上記も編集しました。alert('Update required!');上のupdate-availableイベントoccureことはありません。アラートが未定義であることを示すエラーメッセージウィンドウが表示されます。しかし、どうやらupdate-availableイベントは決して発行されません。


追加情報:

  • 私のアプリはvue-electron v1.0.6ボイラープレートで生成されました。
  • 私のelectron-updaterバージョンは 4.1.2
  • npm run build実際にあるボイラープレートからいくつかのコードを呼び出し.electron-vue/build.jsます。上記のリンクでこのファイルを確認できます(たとえば、NODE_ENVを本番に設定します。package.jsonのスクリプトは次のとおり"build": "node .electron-vue/build.js && electron-builder",です:。
  • 私のリポジトリはプライベートなので、githubでリリースをホストしたくありません。electron.build ドキュメントで、私がそれを行うべきではない情報をいくつか見ました。
  • また、リリースでのみ新しいリポジトリを作成できるという情報をいくつかの問題で見ましたが、よりクリーンなアプローチとして、自分のサーバーですべてをホストすることを検討しています。

ここに例があります:github.com/iffy/electron-updater-exampleは「カスタム」更新をカバーしています
Lawrence Cherone

だから私は何を間違っていますか?
dopeCode


自動更新を正しく実行するには、アプリケーションに証明書で署名する必要がありますか?
dopeCode

@dopeCodeいいえ、自動更新はコード署名なしで機能するはずです。ターミナルでビルドされたexeを開始した後にエラーが表示されない場合はelectron-log、ロガーを使用してautoUpdater に使用するロガーを与えます(const logger = require("electron-log"); autoUpdater.logger = logger; logger.transports.file.level = "debug";)-これにより、情報が出力されますサーバーが見つかり、更新が見つかったかどうか。エラーが発生した場合は、質問に追加できます。
Rhayene、

回答:


9

私はgenericこれまで行ったことがない、ドキュメントに従って公開オプションを使用して自動更新構成をセットアップできました。したがって、それは確実に実行可能であり、証明書による署名は必要ありませんがpublisherName、ビルド構成で設定したので証明書がないため、最初は問題がありました。現在のバージョンに発行元または証明書が指定されていて、新しいバージョンには指定されていない場合も、インストールされません。

1.ロギングを有効にする

electron-updaterインストールelectron-logしてロガーをに割り当てることで、パッケージのロギングを有効にすることができますautoUpdater

const log = require('electron-log');
autoUpdater.logger = log;
autoUpdater.logger.transports.file.level = 'info';

デフォルトの出力パスは次のとおりです。

  • Linux: ~/.config/<app name>/log.log
  • マックOS: ~/Library/Logs/<app name>/log.log
  • ウィンドウズ: %USERPROFILE%\AppData\Roaming\<app name>\log.log

次の手順で問題が解決しない場合は、ログの内容を投稿してください。

2.電話しないでください autoUpdater.setFeedURL()

公式ドキュメントの状態:

setFeedURLを呼び出さないでください。electron-builder app-update.ymlは、ビルド時に自動的にファイルを作成しますresources(このファイルは内部にあるため、意識する必要はありません)。

URLはpublishプロバイダーオブジェクトで既に定義されており、アップデーターを操作するにはこれで十分です。また、の引数としてのURL文字列setFeedURL()は正しくありませんオプションオブジェクトである必要があります。しかし、繰り返しになりますが、publishプロバイダーのすべてを指定することで十分です。

3. .blockmapサーバーにファイルをアップロードする

これらは、セットアップ.exeファイルに加えて、ビルド時に作成する必要があります。そうしないと、ログに古いバージョンと新しいバージョンのファイルが比較のために見つからなかったというエラーが表示されます。

4.更新サーバーのURLに末尾のスラッシュを追加します

urlプロバイダーオブジェクトのパラメーターがスラッシュで終わっていることを確認してください。ymlファイルがなくても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アプリは、それは新しいリリースを見つけた場合は、新しいリリースをダウンロードしてインストール終了させるのに十分ですか?
dopeCode

さて、私は再びこのリスナーを追加し、update-available私が見ることができるいくつかのテキストをupdate-downloadedログに記録しますが、このイベントのログを見ることができないため、決して出力されません。ダウンロードが開始/終了しない理由は何ですか(tbh私はどちらかさえもわかりません)?
dopeCode

checkForUpdatesAndNotifyダウンロードが成功すると通知が表示され、閉じるとアプリが更新されます。しかし、update-downloadedイベントが発生しない場合は、それほど遠くまで届きません。ただし、問題の原因を特定するのは難しいです。
コンスタンティングロース

はい、それupdate-availableは基本的に私の行動は放出されますが、放出されupdate-downloadedません。理由はまだわかりません。私はそれを新しい空のリポジトリで再現しようとします。
dopeCode

ええと、今それは働き始めました。コードは1行も変更しませんでしたが。私はちょうど一日のように待っていました、その間にPCも再起動しました。動作していますが、アプリ全体をダウンロードしてエラーをログに記録します。Cannot download differentially, fallback to full download: Error: Received data length 1527 is not equal to expected 634.また、アプリの終了後に更新を試み、管理者の許可を求めます。許可しない場合は、以前のバージョンでアプリを再度実行できますが、これは望ましくない動作です。ユーザーに強制的にアップデートをインストールさせたい。autoUpdater.quitAndInstall()を使用していますが、終了しません。
dopeCode
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.