このセクションでは、XUL アプリケーションをインストーラにパッケージングする方法について説明します。
XPInstall パッケージ
Mozilla には、XUL ウィンドウやスクリプト、スキンなどのファイルを、インストーラとして単一のファイルにまとめることが可能なメカニズムがあります。 作成したインストーラは、利用者がダウンロードできる場所に置くことが可能です。 そのパッケージがダウンロードされて、インストールされるときのために、簡単なスクリプトを使用することができます。 このメカニズムは、XPInstall (Cross platform Install) と呼ばれています。
XPInstall によるインストーラは、JAR ファイルとしてパッケージされることになります。 この JAR ファイルの中には、様々なインストール対象のファイルを、全て追加することが可能です。 加えてインストーラには、インストール処理を行うために使用する、インストールスクリプト (<tt>install.js</tt>) が含まれている必要があります。 このスクリプトは、ファイルやコンポーネントをインストールするために使用可能な様々なインストール関数にアクセスすることになります。【訳注: Firefox では、<tt>install.rdf</tt> に置き換えられています】
インストーラとしての JAR ファイルは、他のアーカイブと区別するために、通常は <tt>.xpi</tt> という拡張子 (発音は zippy) をつけます。 通常、このインストーラは、新しいスキンやプラグイン、パッケージといった Mozilla のコンポーネントをインストールするために使用されることになります。
インストーラが起動されてコンポーネントがインストールされるときには、いくつかの段階を経る必要があります。 以下で、順を追って説明していきます。
- 利用者が、インストール対象のソフトウェアをダウンロードするための Web ページを作成します。 このページには、インストールトリガーと呼ばれる、インストール処理を起動するための小さなスクリプトを含めておきます。
- インストールトリガーによって、利用者に対して、そのパッケージがインストールされる旨を記したダイアログが表示されます。 インストールトリガーは、複数のインストーラを起動する事も可能です。 この場合は、リストとして表示されます。 利用者は、ダイアログで継続かキャンセルかの選択をすることになります。
- 利用者が継続を選択した場合には、XPI ファイルによるインストーラがダウンロードされます。 この処理の間は、プログレスバーが表示されています。
- インストールアーカイブから、<tt>install.js</tt> ファイルが展開されて、実行されます。 このスクリプトは、アーカイブのどのファイルがインストールされるべきかを示すインストール機能を呼び出します。
- このスクリプトが完了したとき、新しいパッケージのインストールも終了したことになります。 複数パッケージがインストールされる場合には、それらのスクリプトは順番に実行されます。
インストールトリガー
上記したように、インストール処理はインストールトリガーによって開始されます。 ここでは、専用のグローバルオブジェクトである InstallTrigger
が使用されることになり、 このオブジェクトには、インストール処理を開始するために使用可能なメソッドがいくつか含まれています。 このオブジェクトは、ローカルでもリモートコンテンツからでも利用できるため、 Web サイトからダウンロードして使用するのに適しています。
それでは、例としてインストールトリガーを作ってみることにしましょう。 ここでは、InstallTrigger.install()
という関数を使用します。 この関数には 2 つの引数を取り、1 つ目はインストールするパッケージのリスト、 2 つ目はインストールが完了した時に呼び出されるコールバック関数になります。 以下に例を示します。
function doneFn ( name , result ){ alert("The package " + name + " was installed with a result of " + result); } var xpi = new Object(); xpi["Calendar"] = "calendar.xpi"; InstallTrigger.install(xpi,doneFn);
まず、コールバック関数の doneFn()
を定義します。この関数はインストールが完了したときに呼び出されることになります。 もちろん、この関数には好きな名前をつけることができます。 この関数には 2 つの引数が渡されることになります。 最初の引数はインストールされたパッケージの名前で、 これは、複数コンポーネントをインストールする際には重要です。 2 つ目の引数は結果を示すコードです。 結果が 0 ならば、インストールは問題なく成功したことを示し、 結果が 0 以外ならば、エラーが発生したことを意味して、 この場合は、引数の値としてエラーコードが設定されることになります。 ここでは、doneFn()
関数は、単に利用者にアラートボックスを表示するだけです。
次に、インストーラの名称 (Calendar) と URL (<tt>calendar.xpi</tt>) を保持する xpi
配列を作成します。 ここには、インストールしたいパッケージ分だけ、同様の行を追加できます。 そして、最後に install
関数をコールします。
スクリプトのこの部分が実行されたときに、<tt>calendar.xpi</tt> ファイルがインストールされることになります。
ファイル検索ダイアログの例
それでは、ファイル検索ダイアログで、試してみることにしましょう。
function doneFn ( name , result ){
if (result) alert("An error occured: " + result);
}
var xpi = new Object();
xpi["Find Files"] = "findfile.xpi";
InstallTrigger.install(xpi,doneFn);
XPI アーカイブ
インストーラ本体の XPI ファイルには、install.js
という名称のファイルを含んでいる必要があります。 これは JavaScript ファイルで、インストール処理の間を通して実行されます。 また、それ以外に含まれるファイルは、インストールするファイルで、 通常はアーカイブの形式にまとめられて、その中のディレクトリに置かれることになりますが、 それが必須というわけではありません。 通常、クロムのファイルは、chrome ディレクトリと似た構造にまとめておきます。
このため、多くの場合、XPI アーカイブに含まれるファイルは、インストールスクリプト (<tt>install.js</tt>) と JAR ファイルだけになり、 JAR ファイルには、そのアプリケーションで使用される全てのファイルが含まれることになります。 例えば、Mozilla に同梱されているコンポーネントは、この形式で保存されています。
また、XPI ファイルは、単なる ZIP ファイルの一種に過ぎませんので、 作成とファイルの追加には、汎用の zip ユーティリティを使用することが可能です。
ファイル検索ダイアログの例
ファイル検索ダイアログの場合は、以下のような構造でアーカイブを作成することになります。
install.js
findfile
content
contents.rdf
findfile.xul
findfile.js
skin
contents.rdf
findfile.css
locale
contents.rdf
findfile.dtd
パッケージに置く各パートに対応して content
、skin
、locale
ディレクトリが追加されています。 また、クロムファイルを登録するのに必要な <tt>contents.rdf</tt> ファイルも追加されています。
次のセクションでは、インストールスクリプトについて、もっと詳しく見ていきます。