アプリケーションの更新
Electron アプリケーションの自動更新を行うには、いくつかの方法があります。 The easiest and officially supported one is taking advantage of the built-in Squirrel framework and Electron's autoUpdater module.
クラウドオブジェクトストレージ (サーバーレス) の使用
シンプルなサーバーレス更新フローの場合、Electron の autoUpdater モジュールは、最新リリースのメタデータを格納する静的ストレージの URL を指 定すれば更新が利用可能かどうかを確認できます。
新しいリリースを利用可能にしたら、このメタデータをリリース本体と一緒にクラウドストレージに公開する必要があります。 メタデータの形式は macOS と Windows で異なります。
リリースのメタデータの公開
Electron Forge を使用する場合、macUpdateManifestBaseUrl
を使用すれば ZIP Maker (macOS) から、remoteReleases
を使用すれば Squirrel.Windows Maker (Windows) からメタデータのアーティファクトを公開することで、静的ファイルストレージの更新を設定できます。
エンドツーエンドの例については、Forge の S3 からの自動更新 のガイドを参照してください。
手動公開
macOS では、Squirrel.Mac は以下の JSON 形式の releases.json
ファイルを読み取ることで更新を受信できます。
{
"currentRelease": "1.2.3",
"releases": [
{
"version": "1.2.1",
"updateTo": {
"version": "1.2.1",
"pub_date": "2023-09-18T12:29:53+01:00",
"notes": "Theses are some release notes innit",
"name": "1.2.1",
"url": "https://mycompany.example.com/myapp/releases/myrelease"
}
},
{
"version": "1.2.3",
"updateTo": {
"version": "1.2.3",
"pub_date": "2024-09-18T12:29:53+01:00",
"notes": "Theses are some more release notes innit",
"name": "1.2.3",
"url": "https://mycompany.example.com/myapp/releases/myrelease3"
}
}
]
}
Windows では、Squirrel.Windows はビルドの過程で生成された RELEASES ファイルを読み取ることで更新を受信できます。 このファイルには、更新する .nupkg
差分パッケージの詳細が記載されています。
B0892F3C7AC91D72A6271FF36905FEF8FE993520 electron-fiddle-0.36.3-full.nupkg 103298365
これらのファイルは、アプリのプラットフォームとアーキテクチャを考慮したフォルダー構造の配下の、リリースと同じディレクトリに配置する必要があります。
以下がその例です。
my-app-updates/
├─ darwin/
│ ├─ x64/
│ │ ├─ my-app-1.0.0-darwin-x64.zip
│ │ ├─ my-app-1.1.0-darwin-x64.zip
│ │ ├─ RELEASES.json
│ ├─ arm64/
│ │ ├─ my-app-1.0.0-darwin-arm64.zip
│ │ ├─ my-app-1.1.0-darwin-arm64.zip
│ │ ├─ RELEASES.json
├─ win32/
│ ├─ x64/
│ │ ├─ my-app-1.0.0-win32-x64.exe
│ │ ├─ my-app-1.0.0-win32-x64.nupkg
│ │ ├─ my-app-1.1.0-win32-x64.exe
│ │ ├─ my-app-1.1.0-win32-x64.nupkg
│ │ ├─ RELEASES
リリースのメタデータの読み取り
最も簡単なメタ データの利用方法は、autoUpdater を設定し、ドロップインの Node.js モジュールである update-electron-app をインストールすることです。これはネイティブのダイアログでユーザーにプロンプトを表示します。
静的ストレージの更新の場合は、updateSource.baseUrl
引数にリリースのメタデータファイルを格納するディレクトリを指定します。
const { updateElectronApp, UpdateSourceType } = require('update-electron-app')
updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://my-bucket.s3.amazonaws.com/my-app-updates/${process.platform}/${process.arch}`
}
})
update.electronjs.org の利用
Electron チームは update.electronjs.org をメンテナンスしています。これは、Electron を自己更新するためのオープンソースウェブサービスです。 このサービスは次の条件を満すElectronアプリ用に設計されています。
- macOSまたはWindowsで動作するアプリである。
- アプリはGitHubのパブリックなリポジトリである。
- ビルドが GitHub の Releases で公開されている
- ビルドが コード署名 されている (macOS のみ)
このサービスを使う最も簡単な方法はupdate-electron-appをインストールすることで、update.electronjs.orgをつかって、事前調整されたNode.js モジュールを使う方法です。
Node.js パッケージマネージャを使用して、このモジュールをインストールします。
- npm
- Yarn
npm install update-electron-app
yarn add update-electron-app
そして、アプリのメインプロセスファイルから以下のようにアップデータを呼び出します。
require('update-electron-app')()
デフォルト設定で、このモジュールはアプリの起動時に更新をチェックします。または10分毎にチェックします。 アップデートがみつかったとき、自動的にバックグラウンドでダウンロードします。 そのダウンロードが完了したときに、ダイアログを表示してユーザにアプリの再起動許可を取ります。
設定をカスタマイズしたい場合、update-electron-app にオプションを渡す か、アップデートサービスを直接使用 できます。
他の更新サービスを利用する
プライベートの Electron アプリケーションを開発している場合、または GitHub リリースにリリースを公開していない場合は、独自のアップデートサーバーを実行する必要があるかもしれません。
ステップ 1: 更新サーバをデプロイする
ニーズに応じて、次のいずれかから選択できます。
- Hazel – Vercel 上に無料デプロイできる、非公開またはオープンソースのアプリのための更新サーバーです。 それは GitHub Releases から引き出され、GitHub の CDN の力を活用します。
- Nuts – GitHub Releases も使用しますが、アプリの更新をディスクにキャッシュし、プライベートリポジトリをサポートします。
- electron-release-server – リリースを処理するためのダッシュボードを提供します。リリースを GitHub で作成する必要はありません。
- Nucleus – Atlassian がメンテナンスしている Electron アプリのための完全なアップデートサーバー。 複数のアプリケーションとチャンネルをサポートします。サーバーのコストを最小限に抑えるために静的ファイルストアを使用します。
更新サーバをデプロイしたら、Electron の autoUpdater モジュールを使って、アップデートを受信して適用するようアプリのコードに設置できます。
ステップ 2: アプリで更新を受け取る
まず、メインプロセスのコードで必要なモジュールをインポートします。 以下のコードはサーバソフトウェアによって異なる場合がありますが、Hazel を使用する場合は前述の通りに機能します。
以下のコードは、開発時ではなく、パッケージ化されたアプリでのみ実行してください。 You can use the app.isPackaged API to check the environment.
const { app, autoUpdater, dialog } = require('electron')
Next, construct the URL of the update server feed and tell autoUpdater about it:
const server = 'https://your-deployment-url.com'
const url = `${server}/update/${process.platform}/${app.getVersion()}`
autoUpdater.setFeedURL({ url })
最後のステップとして、更新を確認します。 以下の例では、毎分確認します。
setInterval(() => {
autoUpdater.checkForUpdates()
}, 60000)
Once your application is packaged, it will receive an update for each new GitHub Release that you publish.