電子自動更新導入



あなたの電子アプリケーションを構築完了しましたすべては今まで働いているそれはnotarized MacOSで動作するようにし、WindowsやLinux上でアプリケーションをテストしました.あなたは世界とあなたのアプリケーションを共有し、あなたのコミュニティからいくつかの大きな応答を得た.最終的に、より多くのメッセージがあなたのアプリケーションのクラッシュについての受信トレイに表示されます.あなたは、クラッシュを引き起こしていたアプリケーションでバグを発見し、すぐにそれを修正しました.しかし、どのように、あなたはあなたのユーザーにあなたのアプリケーションのこの新しいバージョンを得ますか?

電子自動更新の導入


あなたがすぐにあなたのユーザーにあなたの製品の最新版を出荷することができるように、電子は自動更新機能で発送します.私は自動更新機能を実装したときfirst Electron application , 私は電子メールの自動更新機能がどのように動作するかを把握するためにウサギの穴を下に行きました.
電子自動更新について知っておくべきいくつかのこと
  • MacOSやWindowsをサポートしています( Linux用のサポートはありません).
  • MacOSとWindowsの両方のアップデータの使用Squirrel 舞台裏で.
  • リスのWindows版は、プロジェクトを「再起動」する管理者を探していて、300以上の問題を持ちます.
  • あなたは自動アップデートするためにMacOS上でアプリケーションに署名する必要があります.
  • あなたはmove your applicationApplications ディレクトリの自動アップデートのためのMacOSのディレクトリ.
  • Windowsでは、確認してくださいdon’t update your application その最初の実行、またはあなたのアプリは非常にユーザーをスローされますunfriendly error .
  • 電子自動更新の設定


    電子自動更新の実装は比較的容易ですこれは、展開サーバーと統合するコードの数行が必要です.
    const { app, autoUpdater } = require('electron')
    autoUpdater.setFeedURL('[https://dist.unlock.sh/v1/electron/my-app'](https://dist.unlock.sh/v1/electron/my-app'))
    autoUpdater.checkForUpdates()
    
    通常の間隔で更新をチェックしたい場合(起動時にのみ実行するコード)は、setIntervalを使用して、たとえば30分ごとに確認します.
    setInterval(() => {
      autoUpdater.checkForUpdates()
    }, 30000)
    
    更新プログラムはバックグラウンドでダウンロードされ、自動的にアプリケーションが再起動されるときにインストールされます(ほとんどの時間、いくつかの例外のトラブルシューティングを参照してください).

    あなたのユーザーが新しいアップデートがダウンロードされて、インストールされて利用可能であることを意識させたいならば、あなたはautoupdaterを使うこともできます.を返します.通知は、ユーザーのオペレーティングシステムにネイティブになります.
    あなたの公共のリポジトリの更新を解放する方法を一歩一歩学びたいですか?電子リポジトリについては、以下のセクションをチェックアウトしてください.私は、近い将来、個人のリポジトリのために異なるサーバーを使用することに関して記事を出版します.

    電子自動更新通知の実装


    あなたが代わりにアプリケーションの更新通知で自分自身を使用する場合は、更新されたイベントをAutoUpdaterによって発行されたダウンロードを聞いてこれを行うことができます.
    autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
      //
    })
    
    ReleaseNameはWindowsで利用可能です.
    あなたがUPDATERがアップデートがダウンロードされた直後にあなたの最新版をインストールするのを強制したいならば、あなたはautoupdaterを使うことができます.query ()
    autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
       autoUpdater.quitAndInstall()
    })
    
    彼らはちょうどフォームを記入していた間、あなたのアプリケーションがちょうど終了するときに仕事が失われる可能性があるので、あなたのユーザーは、これを鑑賞できないかもしれないことに注意してください.

    公共リポジトリのための電子自動更新


    あなたのコードリポジトリがGithubで公開可能であれば、あなたのアップデートを出荷するために電子による無料サービスを使用することができます.それは簡単なプロセスです.すぐにこれをテストするためにアプリケーションを足がかりましょう.私は電子フォージの開始テンプレートを使用しています次のコマンドを実行します.
    // Yarn
    yarn create electron-app auto-update-example
    
    // NPM
    npx create-electron-app auto-update-example
    

    パブリック自動アップデータを使用するには、NPM依存関係をダウンロードする必要があります.
    npm install update-electron-app --save
    
    今すぐ糸スタートまたはNPMの起動を実行し、電子アプリケーションを構築し、実行します.

    私たちは公共のgithubリポジトリを必要とするのでgithub.com/new そして、我々が使うことができる倉庫をつくってください.

    自動アップデータをリポジトリに通知するには、パッケージ内で定義する必要があります.JSON :
    {
      "name": "auto-update-example",
      "productName": "auto-update-example",
      "version": "1.0.0",
      "description": "My Electron application description",
      "repository": "[https://github.com/PhiloNL/electron-hello-world](https://github.com/PhiloNL/electron-hello-world)",
      "main": "src/index.js",
      //
    }
    
    src/indexを開きましょう.JSと更新プログラムをチェックするために更新を呼び出すたびに、更新時にユーザーが通知されます.
    app.on('ready', () => {
        updateApp = require('update-electron-app');
    
    updateApp({
            // repo: 'PhiloNL/electron-hello-world', // defaults to package.json
            updateInterval: '1 hour',
            notifyUser: true
        });
    });
    
    次に、我々はGithubに我々のアプリを公開する必要があります.電子は、Githubのために1を含む出版社で2、3のビルディングを船で囲みます.発行者をインストールするには、次のコマンドを実行します.
    npm install [@electron](http://twitter.com/electron)-forge/publisher-github
    
    パッケージ内の異なる発行者の設定を定義できます.JSONファイル.では、Github設定を追加しましょう.
    {
      //...
      "main": "src/index.js",
      "config": {
        "forge": {
          "packagerConfig": {},
          "publishers": [
            {
              "name": "[@electron](http://twitter.com/electron)-forge/publisher-github",
              "config": {
                "repository": {
                  "owner": "PhiloNL",
                  "name": "electron-hello-world"
                }
              }
            }
          ],
          //...
        }
      },
      //...
    }
    
    では、発行コマンドを実行することで、アプリケーションをGithubに公開しましょう.発行コマンドは、あなたのアカウントにアクセスできるように、Githubパーソナルアクセストークンを設定する必要があります.パーソナルアクセストークンを作成できますhere . このトークンを安全に保ち、誰かと共有しないようにしてください.
    この点から、注意してください、あなたはあなたのアプリケーションに署名して、notarizedされる必要があります.署名とあなたのアプリケーションをnotarizingの詳細については、訪問this 記事.
    export GITHUB_TOKEN=<your-token>
    yarn run publish
    

    素晴らしい、あなただけのGithubにバージョン1.0.0プッシュされました.デフォルトでは、あなたのリリースは'ドラフト'に設定され、最終的な承認を待っています.それで、あなたのリポジトリのリリースに頭を向けてください.

    updaterが新しいリリースを発行することによって働くかどうかテストしましょう.src/indexを開きます.HTMLと変更のカップルを作るので、アプリケーションが更新されていることがわかります.
    次に、パッケージを開くことでアプリケーションのバージョン番号を増やします.JSONとバージョン番号の変更
    {
      "name": "auto-update-example",
      "productName": "auto-update-example",
      "version": "1.0.1",
      // ...
    }
    
    ランヤーン実行を再度実行し、Githubを先頭にしてV 1を発行します.アプリケーションの0.1 .V 1を開始する.アプリケーションの0.0と通知を待ちます.

    「再起動」をクリックし、アプリケーションの新しいバージョンが表示されます.

    再び、これは両方のMacOS上で動作し、Windows上でも動作する必要がありますhandle the Squirrel events correctly .

    トラブルシューティング


    自動更新は、シーンの背後に発生するので、あなたのアプリケーションが更新されないときに、非常にイライラすることができます何が起こっているか見当がつかない.
    バックグラウンドで何が起こっているかをデバッグするには、更新電子メールのコンストラクタでそれを渡すことによってロガーを有効にすることができます.
    require('update-electron-app')({
      logger: require('electron-log')
    })
    
    次の場所にログファイルを見つけることができます.
  • リナックス.CONFIG/{ APP NAME }/ログ/{プロセスタイプ}ログ
  • MacOS :/ライブラリ/ログ/{ APP NAME }/{プロセスタイプ}ログ
  • Windows : % UserProfile %\appdata\ローミング{ app name }\プロセス{ log type }を記録します.ログ
  •     [info] Checking for update
        [info] Found version v1.0.1 (url: [https://github.com/PhiloNL/electron-hello-world/releases/download/v1.0.0/auto-update-example-darwin-x64-1.0.0.zip](https://github.com/PhiloNL/electron-hello-world/releases/download/v1.0.0/auto-update-example-darwin-x64-1.0.0.zip))
        [info] Downloading update from [https://github.com/PhiloNL/electron-hello-world/releases/download/v1.0.0/auto-update-example-darwin-x64-1.0.0.zip](https://github.com/PhiloNL/electron-hello-world/releases/download/v1.0.0/auto-update-example-darwin-x64-1.0.0.zip)
    

    リスのアップデータを用いたMacOSのレース条件


    場合によっては、ユーザーがアプリケーションを終了後すぐに起動した場合、アプリケーションが更新するために複数の再起動を必要とする場合があります.autoupdaterを使用する場合も同様です.query ()私は電子ビルダーでこれを経験しました.したがって、これが電子フォージの場合も確かではありません.それでも、私は彼ら全員がリスアップデータを使うので、それはビルトイン電子updaterを使用するどんなアプリケーションにでも影響を及ぼすと仮定しています.
    長い検索の後、私はついにこれを見つけましたissue そしてcomment 可能な解決策で.それは理想的ではないが、問題を修正.
    あなたのアプリケーションを起動すると、リスアップデータは、アプリケーションの新しい更新プログラムを発見した、それはシピットと呼ばれるアイドルのプロセスを生成します.あなたのアプリケーションを終了するまで、このプロセスはアイドル状態のままです.一旦あなたのアプリケーションが閉じられるならば、シピットプロセスはあなたの最新版を抽出し始めて、最新版であなたのアプリケーションを取り替えます.アプリケーションのサイズと、ユーザーのマシンの速度によって、この時間がかかる場合があります.
    あなたのアプリケーションが終了した後にすぐに始まるならば、アップデートが完了する前に、新しいシピットインスタンスはプロセスに代わるでしょう、そして、更新プロセスは再開します.一方、アプリケーションはまだ同じバージョンで実行されているため、ユーザーは混乱する可能性があります.
    The Gist 上記の問題から、シピットプロセスが確実に終わることによって、この問題を解決します.一歩ずつコードを壊しましょう.
    const shipItProcesses = await findProcess('name', 'ShipIt');
    
    シピットというアクティブなプロセスを探します.
    if (shipItProcesses.some(f => f.cmd.includes('com.org.my-app'))) {
      shouldRestartBeforeLaunch = true;
      console.debug('Waiting for auto update to finish');
      setTimeout(makeSureAutoUpdateFinished, 1500);
    } else {
     // ...
    }
    
    ユーザーが複数の電子アプリを実行することができるので、我々はシピットのプロセスは、我々のアプリのCOMに属していることを確認したい.org.マイアプリ.このプロセスが存在する場合、我々はアプリケーションが起動するのを待つので、自動アップデータは終了する機会があります.このチェックはプロセスが終了するまで再帰的に繰り返されます.
            if (shouldRestartBeforeLaunch) {
              try {
                const Electron = require('electron');
                Electron.app.relaunch();
                Electron.app.exit(0);
              } catch (error) {
                console.error('Failed to restart the app through electron', error);
                process.exit(1);
              }
            } else {
              require('./main');
            }
    
    次に、それは更新プロセスを完了するには、既存のアプリケーションを再起動します.これらの複数の再起動は、アプリケーションのMac OSの時間のカップルをバウンスする原因となりますが、少なくともあなたのユーザーは、アプリケーションの最新バージョンを使用していることを確認します.最後に、それはあなたの電子アプリケーションのメインコードを実行します.
    それだ!あなたは正常にあなたのユーザーにアプリケーションの新しいバージョンを配布するGithubと一緒に電子オートアップデートを使用しました.
    あなたがプライベートリポジトリから更新を発行し、あなたの製品をライセンスする方法についての詳細を知りたいですか?将来の記事を購読したり、フォローをしてください.サポートに感謝!
    当初公開https://philo.dev 2021年1月13日