torutkのブログ

ソフトウェア・エンジニアのブログ

WiXによるインストーラ作成

Windows OS上で、MSI形式のインストーラを作るには、いくつかの手段があります。以下記事などに詳しく紹介されています。

InstallShieldは有名ですが価格も高く、一番グレードの低いExpress版も10万円以上の価格がついています。
VisualStudioの機能も無償のExpress版には付いてないため、2010ならProfessional版でやはり10万円以上の価格がついています。

ということで、無償で作成できるWiXを使うことにします。

WiXは、現時点で安定版はバージョン3.5が公開されています。WiXを補完するツールとして無償のWixEditを使うとXML記述の手間を減らすことができます。この2つのツールを組み合わせてインストーラを作成するドキュメントを作成開始しました。

Wixメモ

WixUI_InstallDirと64bit OS

インストール先の選択を可能にするユーザーインタフェース(WixUI_InstallDir)において、デフォルトのインストール先がC:\Program Files (x86)\以下となる場合に、インストーラ実行時のインストール先指定ダイアログで、インストール先をC:\Program Files\以下に変更しても、実際にインストールされる先はC:\Program Files (x86)\以下となってしまいます。

なお、C:\tool\以下を指定した場合はそこにインストールされます。
msiexec コマンドにログ出力オプションを指定してインストールを実行してみたところ、関係しそうなログが採取できました。

msiexec /i hellowix.msi /lx log.txt

ログから該当しそうなところを抜粋します。

MSI (c) (C4:9C) [12:32:06:216]: PROPERTY CHANGE: Modifying HELLOWIX property.
Its current value is 'C:\Program Files (x86)\hellowix\'. 
Its new value: 'C:\Program Files\hellowix\'.
MSI (c) (C4:9C) [12:32:06:275]: WIN64DUALFOLDERS: 'C:\Program Files (x86)\' will 
substitute 17 characters in 'C:\Program Files\hellowix\' folder path.
 (mask argument = 0, the folder pair's iSwapAttrib member = 0).
MSI (c) (C4:9C) [12:32:06:275]: In SetTargetPath, re-mapping 
'C:\Program Files\hellowix\' to 'C:\Program Files (x86)\hellowix\' because 
this is a 32-bit package being installed on Win64.

なお、Wixインストーラ(というかMSIインストーラ)は、32bit版と64bit版を別に作るというポリシーのようです。

64bit版MSIの作成

ディレクトリ要素で、Id="ProgramFilesFolder"としていた箇所を、Id="ProgramFiles64Folder"とします。

この状態で、candleコマンド、lightコマンドを実行すると、lightコマンドでエラーが生じました。

C:\work\hellowix\hellowix_x64.wxs(9) : error LGHT0204 : ICE80: This 32BitComponent HelloWix.cmd uses 64BitDirectory INSTALLDIR

candleコマンドのオプションに"-arch"があり、x64を指定できるので、これを追加してcandleコマンドを実行し、lightコマンドを実行したところ、エラーは発生しませんでした。

この問題について、ブログで触れている人がいました。

このブログの情報を参考に、ディレクトリ要素:Id="ProgramFiles64Folder"へインストールする設定を試行錯誤してみた結果、

  1. candle.exeのコマンドラインオプション"-arch x64"を指定
  2. Package要素のPlatform属性に"x64"を設定、Component要素のWin64属性に"yes"を設定

のいずれかの方法で実現できました。

設定項目 方法1 方法2 備考
candleコマンドラインオプション -arch x64 不要
Package要素のPlatform属性 不要 x64
Component要素のWin64属性 不要 yes

方法2だと、コマンドの実行方法を32bit版と変えずに済むのでよさそうですが、他に影響があるかは未確認です。