Electronのアプリの自動アップデートについて調べる機会があったので書いておきます。
いくつか方法があって
- Electronに元々入っている
autoUpdater
- electron-builder + electron-updater
- update-electron-app
今回は、electron-builder + electron-updaterを試してみました。
electron-builder + electron-updater
npm install electron-updater
Githubでやる場合、package.jsonはこんな感じで。
"build": { "publish": { "provider": "github", "owner": "owner", "repo": "reponame" } }
トークン求められるので、適宜Githubのトークン発行できるところからトークン発行しましょう。
.env
にGH_TOKEN=xxxxxx
の形で置いておけばOKです。
GH_TOKENがあるだけで、勝手にGitHub使われるっぽいですが・・・。
あとはビルドのオプションに--publish always
とかしとくと、ビルドする度にGithubのReleaseにビルドされたファイル上げてくれます。
それが嫌な場合はnever
とか、他はタグつけたときだけとか指定できます。
その他、自前のサーバとかに置く場合はこんな感じに。
"build": { "publish": { "provider: "generic", "url": "http://xxx" } }
(HTTPSじゃないとだめ、みたいな記事も見たけど、そうでもない?)
あとはurlで指定しているとこに、ビルドしてできたファイル群とlatest.yml、latest-mac.ymlを配置しておきます。
versionに-alpha、-betaあたりをつけると、alpha.yml、beta.ymlが作られます。
Vue CLI3
参考までにVue CLI3でプロジェクト作ってて、vue add electron-builder
してる場合はこんな感じです。
(この構成でやってます)
vue.config.jsに
pluginOptions: { electronBuilder: { builderOptions: { publish: { provider: 'generic', url: 'http://xxxxx' } } } }
そんなに変わらないですね。
コードの方
メインプロセスの方に各イベントごとに処理を記述していきます。
一旦↓ここを参考にしつつ、update-downloaded
のイベントだけ足してあげます。
electron-updater-example
よくあるアップデートがあったら再起動するかを聞いてくるやつにしたいので、
autoUpdater.on('update-downloaded', ({ version, files, path, sha512, releaseName, releaseNotes, releaseDate }) => { const detail = `${app.getName()} ${version} ${releaseDate}` dialog.showMessageBox( win, // new BrowserWindow { type: 'question', buttons: ['再起動', 'あとで'], defaultId: 0, cancelId: 999, message: '新しいバージョンをダウンロードしました。再起動しますか?', detail }, res => { if (res === 0) { autoUpdater.quitAndInstall() } } ) ) const min = 10 app.on('ready', () => { setInterval(() => autoUpdater.checkForUpdatesAndNotify(), 1000 * 60 * min) })
10分に一回ペースで見に行って、あれば聞いてくれます。
update-downloaded
にくるのはlatest.ymlに書いてあるもの。
何があるか分かりやすいようにしてます。
やってみて
思っていたよりも簡単にできました。
自前でアップデートがあるかを確認するAPIが必要?という情報で知識が止まっていたので...。