このセクションでは、インストールスクリプトについて述べます。
インストールスクリプトの作成
たいていの場合、インストールの過程で何らかの形での制御を行ないたいと思うでしょう。 例えば、ファイルのバージョンを確認してアップデートされたファイルだけインストールしたいとか、すでにあるファイルにパッチを適用したいとか、です。 インストールスクリプトは、ファイルのアンインストールすら可能なほど柔軟です。 このため、インストーラにはインストール過程をコントロールするインストールスクリプトが入っています。
このインストールスクリプトは、install.js という名前でなければならず、インストーラのアーカイブのトップレベルになければなりません。 スクリプトには、いろいろなインストール関数を呼び出す JavaScript コードが記述されています。
HTML 文書や XML 文書では、window オブジェクトがルート・グローバル・オブジェクトです。 すなわち、window オブジェクトのメソッドは限定子を前に付けずにコールすることができ、window.open(...)
は単に open(...)
と記述できます。 インストールスクリプトでは、関連するウィンドウはありませんが、
Install
オブジェクトがグローバル・オブジェクトであり、インストール過程をカスタマイズする様々な関数を含んでいます。 Install オブジェクトの関数のいくつかは後述します。
インストールスクリプトは次のような手順を取ります:
- どのパッケージとバージョンがインストールされるかを指定し、インストールを初期化する。
- Install 関数を使用して、どのファイルとディレクトリをインストールすべきかを指示する。ファイルの移動や削除も設定できます。
- 必要なファイルをインストールするプロセスを開始する。
ステップ2においては、どのファイルがインストールされるかが指定されるだけで、他の動作は行なわれないことに注意してください。 ファイルがコピーされるのはステップ3です。 こうする事によって、インストールされるファイルの数を簡単に指定でき、何らかのエラーが生じた場合は、ユーザのシステムを変更することなく全過程を中止することができるのです。
コンポーネントレジストリ
Mozilla には、現在インストールされている全てのコンポーネントのレジストリになるファイルがあります。 このコンポーネントには、新しいクロームのパッケージ、スキン、プラグインが含まれます。 新しいコンポーネントがインストールされると、レジストリが更新されます。 これによって、あなたのコンポーネントのバージョンがすでに存在しているかをチェックして、必要な時だけアップデートする事が簡単にできます。
コンポーネントレジストリは、Windows のレジストリといくらか似た働きをします。 キーと値の階層構造です。 XUL アプリケーションを作成する場合、これについての深い知識は必要ありませんが、独自の XPCOM コンポーネントを作成している場合は別です。
インストールにおいて知っておかなければならない事は、レジストリが、ファイルのリストとバージョンなど、あなたのアプリケーションに関する情報を保存している、という事です。 これらの情報の全ては、(上記のステップ1で)あなたがインストールスクリプトで指定したキー(とサブキー)に保存されます。
このキーは次のような形で、ディレクトリのようなパス構造をしています:
/Author/Package Name
Author をあなたの名前に、Package Name をあなたがインストールするパッケージの名称に変更しましょう。例えば:
/Xulplanet/Find Files /Netscape/Personal Security Manager
最初の例は、私たちがファイル検索ダイアログに使用するものです。 次の例は、Personal Security Manager に使用されているキーです。
インストールの初期化
Install オブジェクトには、インストールを初期化する関数である initInstall があります。 これはインストールスクリプトの一番最初に呼び出されなければなりません。 この関数の書式は次のようなものです:
initInstall( ''packageName'' , ''regPackage'' , ''version'' );
An example
initInstall("Find Files","/Xulplanet/Find Files","0.5.0.0");
- 最初の引数は、ユーザが読める形式の、パッケージの名称です。
- 次の引数は、上述した、パッケージの情報を保持するレジストリキーです。
- 第三の引数は、インストールされるパッケージのバージョンです。
次に、ファイルがインストールされるディレクトリを指定しなければなりません。 これには二つの方法があります。
- 簡単な方法は、インストールするディレクトリを指定して、全てのファイルをそこにインストールする方法です。
- 二番目の方法では、目的地をファイルごと(あるいはディレクトリごと)に指定できます。最初の方法を以下に述べます。
setPackageFolder
関数は、インストールディレクトリを指定します。 ファイル検索ダイアログの場合、ファイルは chrome ディレクトリにインストールします(実際には、どこに置いてもかまわないのですが)。 setPackageFolder
は、一つの引数しかなく、それはインストールするディレクトリです。 移植性を最大にするため、ディレクトリのパス文字列を指定する事はできません。 その代わりに、既知のディレクトリの識別子を指定し、そのサブディレクトリを得ます。 これによって、もしアプリケーションがシステムライブラリをインストールする必要があっても、ディレクトリの名称をあらかじめ知っておく必要はありません。
ディレクトリの識別子は、XULPlanet のリファレンスに一覧が載っています。 chrome ディレクトリのディレクトリ識別子は 'Chrome' です。 getFolder
関数は、これらの特別なディレクトリを得るのに使用されます。 この関数には二つの引数があり、最初が識別子で、二番目がサブディレクトリです。 例えば:
findDir = getFolder("Chrome","findfile"); setPackageFolder(findDir);
ここでは、Chorome フォルダの中に findfile フォルダを得て、それをダイレクトに setPackageFolder
関数に渡しています。 getFolder
の二番目の引数は、これからインストールするべきサブディレクトリで、あらかじめ存在していなくても構いません。 また、必要がなければ、この引数は省略できます。
インストールするファイルを設定する
次に、どのファイルがインストールされるかを指定します。 これには二つの関数、addDirectory
と addFile
が使用されます。 addDirectory
関数は、インストーラに、XPI アーカイブのディレクトリ(およびその中身全て)が特定の場所にインストールされるべきである事を知らせます。 addFile
も同様ですが、一つのファイルだけです。
addDirectory
関数と addFile
関数のどちらも様々な形式を取ります。 最も単純なものは一つの引数しかなく、上で指定したインストール先ディレクトリにインストールさせたいインストーラのディレクトリを渡します。
addDirectory (dir ); addFile (dir ); Example: addDirectory("findfile");
上の例は、インストーラ・アーカイブの findfile ディレクトリをインストールする事を指示しています。 他のファイルをインストールするには、これらの関数を何回か使用します。
次に、find files をクロームシステムに登録して、クローム URL から使用できるようにします。 これには、registerChrome
関数を使用します。二つの引数があり、最初のものは登録するクロームの種類(content、skin あるいは locale)です。 二番目は、登録するべき contents.rdf ファイルのあるディレクトリです。 ファイル検索ダイアログには、content、skin ファイル、そして locale ファイルがあるので、registerChrome
は三回コールされなければなりません。
registerChrome(Install.CONTENT | Install.DELAYED_CHROME, getFolder(findDir, "content")); registerChrome(Install.SKIN | Install.DELAYED_CHROME, getFolder(findDir, "skin")); registerChrome(Install.LOCALE | Install.DELAYED_CHROME, getFolder(findDir, "locale"));
DELAYED_CHROME フラグは、クロームが Mozilla の再起動時にインストールされる事を示すのに使用します。
インストールの完了
addDirectory
と addFile
関数は、ファイルのコピーは行ないません。 どのファイルがインストールされるかを宣言するだけです。 同様に、registerChrome
は、登録されるべきクロームを宣言するだけです。 プロセスを終了してファイルのコピーを開始するには、performInstall
関数をコールします。 これには引数はありません。
ファイル検索コンポーネントをインストールする最終的なスクリプトは、次のようになります:
initInstall("Find Files","/Xulplanet/Find Files","0.5.0.0");
findDir = getFolder("Chrome","findfile");
setPackageFolder(findDir);
addDirectory("findfile");
registerChrome(Install.CONTENT | Install.DELAYED_CHROME, getFolder(findDir, "content"));
registerChrome(Install.SKIN | Install.DELAYED_CHROME, getFolder(findDir, "skin"));
registerChrome(Install.LOCALE | Install.DELAYED_CHROME, getFolder(findDir, "locale"));
performInstall();
次に、その他のインストール関数を見てみましょう。