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,
{
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が必要?という情報で知識が止まっていたので...。
Windowsはこれでも大丈夫ですが、Macはコード署名が必要らしく、そこはまだ試せていません。
https://www.electron.build/configuration/configuration