WiX @ wiki
パスの指定
最終更新:
wixwiki
-
view
「SimpleInstaller」ではルートディレクトリ直下にファイルをインストールしたが、通常インストーラは必ず専用のディレクトリ以下にファイルをインストールする。ここではパッケージングするファイルのパス指定や、インストール先のパス指定について解説する。但し、このページで解説することは、全て8.3形式のファイル・ディレクトリ名(「8.3形式の名前参照)に限定した話になっている。ロングファイルネームに対応した内容は、この記事の内容を理解した上で、「ロングパスの指定?」を参照していただきたい。
ファイルをインストールする際のインストール先のディレクトリや、インストーラに組み込まれるファイルの場所を指し示すのが、DirectoryタグとFileタグだ。これらのタグの使い方は意外と癖があるので、順を追って実例を挙げつつ説明していこう。
原則
基本的にDirectoryタグは、親のDirectoryタグで指定されたパスに対して相対的に階層を掘ることになる。ここで言うパスとは
- パッケージング元のパス
- インストール先のパス
の2種類がある。つまり、「どこにあるファイルをパッケージとして固めるのか」を指定するためのパスと、「インストールする際にどこに配置するのか」を指定するためのパスの2つを指定することになる。それぞれ、SourceName属性とName属性で指定することになる。
例えば
<!-- ディレクトリの外 --> <Directory Id="hogehoge" Name="DST1" SourceName="SRC1"> <!-- ディレクトリの中 --> </Directory> <!-- ディレクトリの外 -->
とすると、仮に「ディレクトリの外」の部分が
- パッケージング元パス:C:\SOURCE
- インストール先パス:C:\HOGESOFT
を表しているとすると、「ディレクトリの中」の部分は
- パッケージング元パス:C:\SOURCE\SRC1
- インストール先パス:C:\HOGESOFT\DST1
を表していることになる。
トップディレクトリ
Productタグの直接の子要素として書かれたDirectoryタグ(つまりDirectory階層の最も上位に存在するDirectoryタグ)は、特殊な指定をする必要があるようだ。
<Product ...省略... > <Directory Id="TARGETDIR" Name="SourceDir"> <!-- ディレクトリの中 --> </Directory> </Product>
この時、「ディレクトリの中」の部分は
- パッケージング元パス:.\SourceDir (カレントディレクトリ下のSourceDir以下)
- インストール先パス:C:\ (ファイルシステムのルートディレクトリ)
となる。
トップディレクトリに限ってはIdを「TARGETDIR」に、Nameを「SourceDir」にしなくてはいけない。これは、WindowsInstallerのデータベースのほうの設定値の制約である。(といいながらも、実際にはこの記述を変えてもうまくいく場合がある。恐らくWixがWixのXMLからWindowsInstallerのテーブル構造に変更する際によきにはからってくれているようだが、WiXの仕様が厳密な方向に変更された場合に動作しなくなる可能性も高いため、「決まりごと」としてこの記述にしておくほうが無難かもしれない)
パッケージング元パスの強制変更
パッケージング元のパスを、インストール先のディレクトリ構造とは無関係につけたい場合がある。
例えば、インストール先として
C:\会社名\ソフト名\バージョン名\
のように深い場所を指定(これはごくごく自然なことだろう)する場合、ここまでのやり方ではパッケージング元のパスも非常に深くなってしまう。
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="dir1" Name="HOGECORP" SourceName="SRC1"> <Directory Id="dir2" Name="HOGESOFT" SourceName="SRC2"> <Directory Id="dir3" Name="VER001" SourceName="SRC3"> ...実際にインストールしたいもの... </Directory> </Directory> </Directory> </Directory>
この場合であればパッケージング元のディレクトリが
.\SourceDir\SRC1\SRC2\SRC3\
となってしまう。このパッケージング元のディレクトリをコントロールするには、FileSourceという属性を指定すればよい
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="dir1" Name="HOGECORP" SourceName="SRC1"> <Directory Id="dir2" Name="HOGESOFT" SourceName="SRC2"> <!-- ディレクトリの場所1 --> <Directory Id="dir3" Name="VER001" FileSource=".\SRC"> <!-- ディレクトリの場所2 --> </Directory> </Directory> </Directory> </Directory>
Id属性がdir3となっているDirectoryタグは、SourceName属性の変わりにFileSource属性がついている。そしてFileSource属性の値としては .\SRC となっている。このFileSource属性は、上位ディレクトリで指定されたパッケージング元パスを無視し、強制的に別のパスをパッケージング元として指定するものだ。
「ディレクトリの場所1」は
「ディレクトリの場所1」は
- パッケージング元パス: .\SourceDir\SRC1\SRC2\
- インストール先パス: C:\HOGECORP\HOGESOFT\
を示しているのに対し、「ディレクトリの場所2」は
- パッケージング元パス: .\SRC\
- インストール先パス: C:\HOGECORP\HOGESOFT\VER001\
を示していることになる。このようにFileSource属性を使用することで、パッケージング元のパスのみ上位のDirectoryタグと無関係に変更が出来る。
ソースディレクトリを省略
ここまでDirectoryタグには必ずパッケージング元を表すSourceName属性かFileSource属性を指定してきた。が、実は指定しなくてもコンパイルできる。
例えば
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="dir1" Name="HOGECORP"> <Directory Id="dir2" Name="HOGESOFT"> <Directory Id="dir3" Name="VER001"> <!-- 実際にインストールしたいもの --> </Directory> </Directory> </Directory> </Directory>
のような形だ。
「実際にインストールしたいもの」の、インストール先がどこになるかはここまでの話でわかるとおり
「実際にインストールしたいもの」の、インストール先がどこになるかはここまでの話でわかるとおり
C:\HOGECORP\HOGESOFT\VER001
となる。ではパッケージング元のパスはどうなるのかというと、
.\SourceDir\HOGECORP\HOGESOFT\VER001\
となる。
これはつまり、Name属性に指定した値がそのままSourceName属性の値となっている状態であり、
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="dir1" Name="HOGECORP" SourceName="HOGECORP"> <Directory Id="dir2" Name="HOGESOFT" SourceName="HOGESOFT"> <Directory Id="dir3" Name="VER001" SourceName="VER001"> <!-- 実際にインストールしたいもの --> </Directory> </Directory> </Directory> </Directory>
と同じことを意味している。
ファイルパスの指定
ここまでディレクトリパスの色々な指定方法について記述してきた。が、肝心のインストールするファイルそのもののパス記述方法について書いていないので、ここで説明しよう。
Fileタグでのパスを決める要素として、Name属性とSource属性がある。Name属性はDirectoryタグにおけるName属性と同じような意味で、インストール先でのファイル名になる。Source属性はDirectoryタグにおけるFileSourceと同じような意味で、上位のDirectoryタグで指定されたパッケージング元パスを無視して、強制的に別のパスをパッケージング元ファイルとして指定する。
また、Directoryタグと同じように、Source属性が省略された場合、Name属性の値がSource属性の値として使用される。
また、Directoryタグと同じように、Source属性が省略された場合、Name属性の値がSource属性の値として使用される。
例えば
<Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="dir1" Name="HOGECORP"> <Directory Id="dir2" Name="HOGESOFT"> <Directory Id="dir3" Name="VER001"> ... コンポーネントの表記は省略 ... <File Id="file1" Name="FILE1.TXT" Source=".\SRC.TXT" /> <File Id="file2" Name="FILE2.TXT" /> ... コンポーネントの表記は省略 ... </Directory> </Directory> </Directory> </Directory>
のように指定した場合、
Id属性がfile1のファイルは
Id属性がfile1のファイルは
- パッケージング元パス:.\SRC.TXT
- インストール先パス: C:\HOGECORP\HOGESOFT\VER001\FILE1.TXT
Id属性がfile2のファイルは
- パッケージング元パス:.\SourceDir\HOGECORP\HOGESOFT\VER001\FILE2.TXT
- インストール先パス: C:\HOGECORP\HOGESOFT\VER001\FILE2.TXT
というようになる。
visitor: - (today: - ) Author : nagatyo
コメント (注:コメントは管理人が適宜消去する場合があります)