Firefoxアドオンを自分で公開(self hosted)する方法


<2018年一人なんでもアドベントカレンダー1日目>

はじめに

Firefoxの拡張機能を公開したい場合、ストアに申請して公開するのが通常の方法ですが、公開条件を満たす必要があります。
例えば、社内用アプリケーションを使って社員のみが使うような拡張機能の場合、用途と利用者が限定すぎるためにリジェクトされたりします。
そのときに「自分で公開(self hosted)」という方法があります。

updates.jsonを用意

まずはアップデート情報を記述するupdates.jsonを用意します。
あとで説明しますが、拡張機能のmanifest.json内にこのupdates.jsonファイルのURLを記述することで、拡張機能は更新の有無を知ることができるようになります。

updates.json
{
  "addons": {
    "<拡張機能のUUID>": {
      "updates": [
        {
          "version": "1.0.0.0",
          "update_link": "https://server.com/myextension.xpi"
        },
        {
          "version": "1.0.1.0",
          "update_link": "https://server.com/myextension.xpi"
        }
      ]
    }
  }
}

versionに拡張機能のバージョン番号を、update_linkにあとで置くことになるxpiファイルのURLを指定しておきます。
ここでは仮にhttps://server.com/myextension.xpiに置いたとします。

manifest.jsonをサーバーに置く

ブラウザからhttpsでアクセスできればどこでも良いです。
ここでは仮にhttps://server.com/updates.jsonに置いたとしましょう。

manifest.jsonにupdates.jsonのURLを追記

manifest.json
抜粋
 "applications": {
    "gecko": {
      "id": "<拡張機能のUUID>",
      "update_url":"https://server.com/updates.json",
      "strict_min_version": "42.0"
    }
  },

applicationsプロパティの中にupdate_urlプロパティを追加し、先程のupdates.jsonファイルのURLをhttps://から記述します。

開発者センターで拡張機能に署名

公開するには拡張機能に署名を施す必要があります。
開発者センターにログインし、「新しいアドオンを登録」をクリックします。

配布手段に「自分自身で。」を選択して「続ける」をクリックします。

拡張機能の.xpiファイルをアップロードして「アドオンを署名」をクリックします。

ここは「いいえ」を選択して「続ける」をクリックします。

これで署名が完了しました。
ダウンロードボタンを押してxpiファイルをダウンロードします。

xpiファイルをサーバーに置く

それをupdates.jsonに記述したxpiファイルのURLと同じ場所に置きます。
ここではhttps://server.com/myextension.xpiですね。

これで公開されました。

初回インストール

xpiファイルのURLにアクセスすればインストールされます。

拡張機能の更新

拡張機能を更新するときは、プログラム的な変更を行った後に以下の作業を行います。

  1. manifest.jsonのバージョンを変更
  2. updates.jsonに新しいバージョンの情報を追加する
  3. 開発者センターで拡張機能に署名
  4. xpiファイルとupdates.jsonをサーバーに置く

2のバージョン情報の追加は以下のようにします。
例えば新しいバージョン1.0.1.1を追加します。

updates.json
{
  "addons": {
    "<拡張機能のUUID>": {
      "updates": [
        {
          "version": "1.0.0.0",
          "update_link": "https://server.com/myextension.xpi"
        },
        {
          "version": "1.0.1.0",
          "update_link": "https://server.com/myextension.xpi"
        },
        {
          "version": "1.0.1.1",
          "update_link": "https://server.com/myextension.xpi"
        }
      ]
    }
  }
}