nw-autoupdaterを使用してクライアントアプリケーションの自動アップグレードを実現

2687 ワード

この間、新しいニーズが開発され、アプリケーションの自動検出更新アップグレードを実現することが要求されました.クライアントはnwを通過する.jsが開発したnw.jsの公式ドキュメントには3つの方法があり、nw-autoupdaterを選択して実現しました.具体的な実現原理は、まずリモートサーバからプロファイルを読み取ることです.リモートプロファイルのバージョンがローカルバージョンより大きいかどうかを確認します.リモートサーバに最新バージョンがある場合は、最新のパッケージをダウンロードします.ダウンロードしたインストールパッケージを一時ディレクトリに解凍し、アプリケーションを閉じて最新バージョンを起動し、アプリケーションを再起動します.まずgithubのdemoを見て、https://github.com/dsheiko/nw-autoupdaterということで、アップグレードの試みが始まりました.nodeを使用してサーバを構築し、アップグレードサーバをシミュレートします.github上のプロジェクトをローカルにダウンロードし、他のファイルは動かず、packageに直接送信します.jsonファイルは構成を変更し、対応するアップグレードパッケージを構成ファイルの対応する場所に配置します.
次に、プロジェクトにアップグレードに関するロジックを追加します.まず、プロジェクトに依存パッケージnw-autoupdaterをダウンロードします.npm install nw-autoupdater-save-devから直接ダウンロードできます.次に、コードに検出バージョンを追加する方法
    checkBrowserVersion: function () {
    const AutoUpdater = require( "nw-autoupdater" ),
    updater = new AutoUpdater( require( "../package.json" ) );
    async function main(){
    try {
    // Update copy is running to replace app with the update
      if ( updater.isSwapRequest() ) {
         var page = document.getElementById("homePage");
         var pageLoading=document.getElementById("loadingBox");
         page.style.display = "none";
         pageLoading.style.display="block";
         await updater.swap();
         await updater.restart();
         return;
        }
    // Download/unpack update if any available
    const rManifest = await updater.readRemoteManifest();
    const needsUpdate = await updater.checkNewVersion( rManifest );
      if ( !needsUpdate ) {
         return;
      }
      if (!confirm( $translate.instant('IDS_UPDATE_ALERT'))){
         return;
      }
      // Subscribe for progress events
      updater.on( "download", ( downloadSize, totalSize ) => {
        console.log( "download progress", Math.floor( downloadSize / totalSize * 100 ), "%" );
      });
      updater.on( "install", ( installFiles, totalFiles ) => {
        console.log( "install progress", Math.floor( installFiles / totalFiles * 100 ), "%" );
      });
      const updateFile = await updater.download( rManifest );
      await updater.unpack( updateFile );
      alert( $translate.instant('IDS_UPDATE_RESTART'));
      updater.restartToSwap(rManifest);
    } catch ( e ) {
        console.error( e );
        }
    }
      setTimeout(function () {
        main();
      }, updater.isSwapRequest()?0:1000);
    }

意外でなければ自動アップグレードが可能ですが、ここで注意しなければならないのは、アップグレードパッケージは圧縮形式でなければなりませんが、最新のインストールパッケージではありません.OSxでは、アップグレードパッケージは直接最新バージョンです.appファイル圧縮;windwosシステムでは、アップグレードパッケージはインストールに成功した後、フォルダのルートディレクトリの下にあるすべてのファイルを開きます.