WiXメモ
ちょこっと前に仕事で初めて使ったのでメモ。
WiX(Windows Installer XML)
- XMLでインストーラ(MSIやMSM)を作ることができる。
- IDE(VisualStudio)でビルド可能。
- 拡張機能をインストールする必要がある。
- ツール - 拡張機能と更新プログラム から、WiXをオンライン検索してインストール
- Wix Toolset Visual Studio ~
主なXML要素
- Wix:ルート。
- Product:インストールするアプリケーションの説明など。実際のルート。msmならModuleになる。
- Directory:インストール先の指定。IdをTARGETDIRとするとROOTDRIVEとなる。階層構造にしたい場合はネストして書く。
- CustomAction:DOSコマンドなどを実行したいときはこれ。
- InstallExecuteSequence:インストール/アンインストール中のどのタイミングで何を実行するのかなどを指定する。かなり詳細な設定が可能。
- UI:UI部分。
Tips
・アンインストール時のみ実行したいものがあるとき
CustomActionを定義する。
InstallExecuteSequenceに定義したCustom Actionを追加する。
例:
<Custom Action="UninstallTask" After="InstallInitialize"><![CDATA[Installed AND NOT UPGRADINGPRODUCTCODE]]></Custom>
ポイント
・InstallFinalize のタイミングだと事が終わったあとに実行するのでその時はファイルがすでにない
・実行条件をInstalled AND NOT UPGRADINGPRODUCTCODEとする
参考:How to add a WiX custom action that happens only on uninstall (via MSI)?
→CustomActionを実行したあとどうも並行で動作してそうで、InstallInitializeのタイミングでも消えていることがありそう(推測) 。
・対象とするバージョンを限定したいとき
CustomActionの実行条件に加える。
例:
<![CDATA[NOT Installed AND (VersionNT >= 502 OR VersionNT64 >= 502)]]>
参考:How do I install resources based on the Operating System version?
・タスクスケジューラ登録に失敗するとき
Windows2016Serverにおいて、タスクスケジューラ登録時に以下のエラーが発生してうまくできないことがあった。
ERROR:no mapping between account names and security ids was done.<br>(43,4):UserId:
UserIdが空になっていることから、おそらくOS側でユーザー情報が参照できなかったため、
(セキュリティIDとのマッピングが行えなかった)だと推測する。※セキュリティ関連の強化による?
SCHTASKS コマンドの引数にユーザー名を渡すことで動作するようになる(/RUオプションを使用する)。
ユーザー名を指定する場合はコンピュータ名から必要であることに注意する。(computername\username)
参考URL
チュートリアル
WiXではじめるWindows Installer作成入門連載一覧
書籍
まとめ
- 大体の使い方が分かると、割と簡単にインストーラを作ることができる。
- Windows Serviceアプリケーションの場合、インストール時にサービス登録したりもできる。
- 今回は使用しなかったが、前提条件(特定の.NET frameworkがいるとか)も設定できたりもするし、かなり柔軟に色々できる。