WiX @ wiki

Componentの概念

最終更新:

wixwiki

- view
管理者のみ編集可
SimpleInstaller」の中でComponentというタグが出現した。このComponentというタグだが、私個人としてはWiXを理解する上で非常に重要なキーワードの一つだと考えている。

というのは、インストーラが行う様々なアクションの大半がComponentタグに含まれている(Componentタグの直接の子要素になる)ためだ。つまり、Componentタグに含まれるタグ = インストーラが実行できる大半のアクション ということだ。マニュアルでComponentタグの子要素をじっくり眺めることで、WindowsInstallerでどんなことができるのか理解できる。

余談だが、私がこの事実に気づいたのはこの記事を書き始めるわずか数日前だ。WiXに出会ってから数ヶ月間、WiX(WindowsInstaller)で何ができるのかいまいちわからず、どこを調べればよいのかもわからなかったため、結局インストーラを補助する外部プログラムを作りこむという、今考えると馬鹿馬鹿しいことを延々やってきた。これを読んだ方々は私と同じ道を歩まないよう、マニュアルでComponentタグの子要素に少なくとも一度はざっと目を通すことをお勧めする。(英語が苦手な私ですら、タグ名を見ればなんとなくわかるレベルのものなので気楽に眺めてみてほしい)

(結論の無い話その1)Component内の実行タイミング

Componentタグに関連する内容に少し触れておこう。

ドキュメントを見てわかる通り、Componentタグの子要素は実に様々なものがある。そしてこれらの要素は、記述方法が全く統一されていない点に注意しなくてはならない。

特に戸惑うのは「いつ実行されるのか」という点だ。例えば「SimpleInstaller」の例を見てみよう。

<Component Id="COMPONENT1" ...省略... >
    <File Id="MAINFILE" Name="TEST.TXT" />
</Component>

Componentタグの中にFileタグがあるが、いつ配置するとも削除するとも書いていない。にもかかわらず、インストールするとこのファイルが配置され、アンインストールするとこのファイルが削除される。

別の例を見てみよう。

<Component Id="COMPONENT1" ...省略... >
    <RemoveFile Id="REMOVEFILE" Name="TEST.TXT" On="install" />
</Component>

これはインストール時にTEST.TXTというファイルを消すコードだ。RemoveFileというタグの中にOnという属性があることがわかるだろう。RemoveFileタグにおけるOn属性が取りうる値は、「install」と「uninstall」、そして「both」がある。つまり、このOn属性の値によって、インストール時に削除するのか、アンインストール時に削除するのか、それともどちらのときも削除するのかをコントロールすることになる。
このようにComponentの子要素は、実行タイミングの記述の仕方をはじめとして、色々と異なる部分が多い。マニュアルを見てもタグによっては明確に書かれていないことが多い。ここまで読んできた皆さんはガックリするかもしれないが、結論としてはサンプルコードを作って試行錯誤する以外に、確実に仕様を知る方法はなさそうだ、ということだ。


(結論の無い話その2)Componentの矛盾


インストーラはComponentの単位でインストールやアンインストールを行う。また、インストールやアンインストールをするかどうか、という判断もComponent単位で行う。
例えばある種のインストーラ(典型的な例で言えば、MicrosoftのOfficeやVisualStudio等のインストーラ)では、インストールする機能を選択できることをご存知だろう。このインストールする機能を選択するというのは、内部的にはComponentタグごとにインストールするかどうかを判断することで実現している。

それでは、たくさんのファイルを常に全てインストールする、という場合であればComponentタグ1つの中に全てを押し込めばよいのだろう、と思うかもしれない。ところが、実際にはそんなに簡単にはいかない。例えば、複数のディレクトリにファイルをインストールしたいときなどはその典型例だ。

<Directory Id="TARGETDIR" Name="SOURCE">
    <Directory Id="DIR1" Name="DIR1">
        <Component Id="COMP1" ...省略... />
            <File Id="FILE1" Name="TEST1.TXT" />
        </Component>
    </Directory>
    <Directory Id="DIR2" Name="DIR2">
        <Component Id="COMP2" ...省略... />
            <File Id="FILE2" Name="TEST2.TXT" />
        </Component>
    </Directory>
</Directory>

上記の例は、C:\DIR1\TEST1.TXT というファイルと C:\DIR2\TEST2.TXT という二つのファイルをインストールしようとした場合の書き方だが、見て判るとおりComponentが2つになってしまう。これを1つにすることは(恐らく・・)できない。というのもWindowsInstallerではDirectoryをComponentの中に含めることができないため、このような書き方にならざるを得ないのだ。

このような「なんか変だ・・・?」という構造がWindowsInstaller(あるいはWiX)にはいくつもある。なぜそうなのかは知らなくて問題ない。しかし残念ながらWindowsInstallerの仕様である以上、それに従わずにはインストーラは作れない。


visitor: - (today: - )  Author : nagatyo

コメント (注:コメントは管理人が適宜消去する場合があります)
名前
コメント

すべてのコメントを見る

記事メニュー
目安箱バナー