2016-11-01 11 views
1

Chrome拡張機能をアップデートしている間にバージョン番号を比較したいと思います。Google Chrome拡張機能の現在のバージョン番号と以前のバージョン番号を取得する

理由は構造的な変更がいくつかあり、私のユーザー(既に自分のモジュールを所有しているユーザー)に詳細を追加してもらいたくないからです。私が更新していながら、どのように私はバージョンを比較することができ、

chrome.runtime.getManifest().version 

私の質問があり、または私は見ておくべきである:

は、私はこのラインで現在実行中のモジュールのバージョン番号を取得することができることを知っています別の角度からの問題?

答えて

3

アップグレード時に呼び出されるAPIはchrome.runtime.onInstalledです。

chrome.runtime.onInstalled.addListener(details => { 
    if (details.reason === "update") { 
    let newVersion = chrome.runtime.getManifest().version; 
    console.log(`Updated from ${details.previousVersion} to ${newVersion}`); 
    } 
}); 

あなたのロジックをそれに依存させることはできますが、脆弱です。ストレージスキーマはすべてのバージョンを変更する可能性は低く、アップグレードは1回ではなく、バージョンを飛ばしてはいけないユーザー(たとえば、長い間マシンがオフラインだったユーザー)を考慮する必要があります。また、バージョン文字列を比較する組み込み関数もありません。

データスキーマのバージョンをデータ自体とともに保存し、データ移行をonInstalledから開始する方がはるかに優れています。

var defaults = { 
    someData: "reasonableDefault", 
    /* ... */ 
    storageSchema: 5 // Increment this when data format changes 
}; 

chrome.runtime.onInstalled.addListener(details => { 
    if (details.reason === "update") { 
    migrateData(doSomeInitialization); 
    } 
}); 

function migrateData(callback) { 
    // This pulls stored values, falling back to defaults, if none 
    chrome.storage.local.get(defaults, data => { 
    let migrated = false; 
    while (!migrated) { 
     switch (data.storageSchema) { 
     case 1: 
      /* modify data to migrate from 1 to 2 */ 
      data.storageSchema = 2; 
      break; 
     /* ... */ 
     case 4: 
      /* modify data to migrate from 4 to 5 */ 
      data.storageSchema = 5; 
      break; 
     case defaults.storageSchema: // Expected; we're done migrating 
      migrated = true; 
      break; 
     default: 
      throw new Error(`Unrecognized storage schema ${data.storageSchema}!`); 
     } 
    } 
    chrome.storage.local.set(data, callback); 
    }); 
} 

あなたはstorageSchemaが古いバージョンでは使用されなかった場合のために、いくつかの特別なロジックが必要になります注。それ以外の場合、このコードはデフォルト値を提供します(記憶域にないため)。マイグレーションは行われません。最初のバージョンが公開される前にを実装するのが最善です。注意すべき

ことの一つは、(2016年11月1日現在)というFirefoxのWebExtensions don't support onInstalled yet(編集:FF 52で修正された決議)ですが、この機能は、すべての拡張開始上で実行しても安全です。 onInstalledは単なる最適化です。

+0

うわー、それは非常に便利で便利でした!どうもありがとうございました! – Gregion

+0

@Gregion Firefoxの移植性に関する注意を追加しました – Xan

関連する問題