Electronアップデータのチャネル対応


自分用メモなので殴り書き注意

もろもろ都合でelectron, electron-builderも古い。
けど、基本的な構造はそんな変わってない。。。ような気がする。。。(未確認)

package.json 設定

package.json
  "dependencies": {
    "electron-auto-updater": "^1.0.0"
...
  }
  "devDependencies": {
    "electron": "^2.0.0",
    "electron-builder": "^20.15.1",
    "electron-packager": "^12.1.0",
    "electron-updater": "^2.21.10"
  },
  "build": {
    "win": {
      "target": "nsis",
      "icon": "icon.ico",
      "publish": [
        {
          "provider": "generic",
          "url": "{インストーラ配置URL}"
        }
      ]
    }
  }

インストーラ配置URLには、build実行時にできる「latest.yml」と、インストーラEXE実体を置く。
HTTPS対応してないとダメだったような。
インストーラEXEはバージョンによってファイル名変わる。

アップデータ処理

main.js
const autoUpdater = require('electron-auto-updater').autoUpdater;

// アップデート確認
autoUpdater.checkForUpdates();

// アップデート確認開始
autoUpdater.addListener('checking-for-update', function() {
    console.log("checking-for-update");
});

// アップデートあり
autoUpdater.addListener('update-available', function() {
    console.log("update-available");

    // レンダープロセスへ通知
    mainWindow.webContents.send('update_available', 'アップデートあったよ');
    mainWindow.webContents.on('did-finish-load', () => {
        console.log('did-finish-load');
        mainWindow.webContents.send('update_available', 'アップデートあったよ');
    });
});

// アップデートなし
autoUpdater.addListener('update-not-available', function() {
    console.log("update-not-available");

    mainWindow.webContents.send('update_not_available', 'アップデートなかったよ');
    mainWindow.webContents.on('did-finish-load', () => {
        console.log('did-finish-load');
        mainWindow.webContents.send('update_not_available', 'アップデートなかったよ');
    });
});

// アップデートダウンロード完了
autoUpdater.addListener('update-downloaded', function(event, releaseNotes, releaseName, releaseDate, updateURL) {
    console.log("update-downloaded");
    console.log(releaseName);
    mainWindow.webContents.send('update_downloaded', 'DLしたよ');
    return true;
});

// アップデートインストール開始(レンダラープロセスから呼ぶ)
ipc.on('do_quit_and_install', function(event, args) {
    console.log("do_quit_and_install");
    autoUpdater.quitAndInstall();
});

バージョン、マルチチャネル

バージョンは通常「X.X.X」形式

package.json内のバージョンを「X.X.X-beta.1」などとすると、betaチャネル用のビルドが作成できる。
対応している文字列は、「alpha」「beta」。(他にもあるかもしれないが未確認)

ベータ版でインストールした場合は、アップデートチャネルがbetaとなる。
(アップデータ配置URL内の、beta.ymlを参照しにいく)
ベータ版インストール後に自動で通常版に戻したい場合は、beta.ymlの内容を、latest.ymlの内容で置き換える。