[ Topページへ戻る ] [ Windowsメモへ戻る ]

Windows上でWixおよびWixEditを使ったインストーラ作成

 

はじめに

自分で作ったプログラムやデータを、配布されるプログラムのように、インストーラでインストール/アンインストールすることができると便利です。また、アップデートやパッチ更新といった応用もできるとなおよいです。Windowsでは、MSI形式のインストーラを作成することで実現できます。

ツールWiX/WixEditについて

Windows Installer XML(Wix)は、マイクロソフトがスポンサーとなっているオープンソースツールです。インストール設定情報をXMLで記述し、コマンドでMSI形式のファイルを作成します。

設定情報を一から手で記述するのは大変なので、別途オープンソースのツールWixEditを使うと便利です。WixEditは、設定情報のXMLファイルをGUIで編集します。

入手とインストール

WiXは、以下URLから入手します。

2012年9月30日現在、最新バージョンは3.6(WiX36.exe)です。

WixEditは、以下URLから入手します。

2012年9月30日現在、最新バージョンは0.7.5(wixedit0.7.5.msi)です。

まず、両者をインストールします。

WiXは、標準ではC:\Program Files (x86)\WiX Toolset v3.6 にインストールされます(64bit Windows)。ツールはコマンドで提供されるので、以下パスを環境変数PATHに追加しておきます。

C:\Program Files (x86)\WiX Toolset v3.6\bin

通常使うコマンドは、candle.exelight.exe です。環境変数PATHを設定した後、コマンドプロンプトからcandleコマンド、lightコマンドを実行できるか確認しておきます。

WixEditは、標準ではC:\Program Files (x86)\WixEdit にインストールされます。GUIツールなので、スタートメニューから[WixEdit]>[WixEdit]を実行します。

参考情報

WiXに関する参考情報を挙げます。

最初のインストーラ作成 - HelloWix

ファイル1つからなるソフトウェアを、C:\Program Files\hellowixにインストールする単純なインストーラを作成します。

作業準備

まず、作業ディレクトリを作り、インストールするファイルを置きます。ファイルは何でもよいですが、以降の説明では、HelloWix.cmd というファイルを使用します。

C:\work> mkdir hellowix
C:\work> cd hellowix
C:\work\hellowix> dir /B 
HelloWix.cmd
C:\work\hellowix>

設定情報XMLファイル作成

次に、WixEditを起動してインストール設定を記述するXMLファイルを作成します。ここではhellowix.wxsとします。

WixEdit起動後、[File]>[New]を選ぶと、「WixEdit wizard」ダイアログが表れます。[Next]を押すと、「Add files and folders to install.」画面になります。

ウィザードで指定しなくても、後でディレクトリ/ファイルの追加はできるので、ここは追加をせず[Next]で次へ進みます。

WixEdit 0.7.5で、このウィザード上で追加したファイルのパス情報に問題がありました(絶対パスからドライブレターが抜けた指定となってしまう)。

次は、「Select features to add」画面になります。

インストーラに含める機能を指定することができます。一番使うのは、インストール先ディレクトリを選択したり、インストールするコンポーネントを選択したりするGUIを追加する"Add Userinterface"、インストール時にデスクトップやスタートメニューにショートカットを作成する機能と思います。今回はシンプルなインストーラを作るので指定はせず、[Next]ボタンを押します。

ウィザードはこれで完了するので、[Finish] ボタンを押します。

ここから、必要な設定情報を記述して、HelloWixインストーラを完成させます。

まず、真ん中のツリー表示パネル上で"Product"を選択します。右側にProduct要素の属性が一覧表示されます。

Product要素に関する属性の定義
属性  内容  備考 
 Id  Windowsがインストールする製品を識別するID。このIDが一緒たど同一製品と認識するので、既にインストールされている製品のIDと同じIDを使って後からインストールするとエラーとなる。
複数バージョンを同時にインストール可能とするときは同じ製品でもこのIDを変える(と思われる)。
デフォルトのままでよい 
 Language  インストーラが表示する画面に表すテキストの言語を指定する。 日本語にしたいので、「1041」に変更する 
 Codepage*1  インストーラがテキストの表示に使用する文字コードを指定する。 日本語Windows標準に合わせて「932」に変更する 
 Manufacture  製品の作成者(日本語で記述するときは後述のPackage要素に属性SummaryCodepageの指定をしないと、MSIファイルのプロパティー詳細で作成者欄が文字化けとなる) 自分の名前を記述 
 Name  製品名。Windowsのアンインストールで一覧に表示される名前  「HelloWixサンプル 1.0」
 UpgradeCode  Idが異なるとき、UpgradeCodeが一致すれば、同一製品のバージョン違いと認識される。 デフォルトのままでよい 
 Version  バージョン番号を記載する。数値4項目をピリオド区切りで示す。
メジャー番号.マイナー番号.ビルド番号.ユーザー定義番号
 メジャー番号は255以下の整数、マイナー番号は255以下の整数、ビルド番号は65535以下の整数。
 ユーザー定義番号は省略可能、インストーラは関知しない。
「1.0.0」とする 

*1) WixEditのウィザード生成直後はCodepage属性が表示されていないので、左側ペインで"Product"を選択状態にし、右側ペインの余白で右クリックしポップアップメニューの[New]を選択、「New Attribute Name」ダイアログが表示されるので、"Codepage"を選択する。記述が終わった時点で以下の画面となる。

続いて、真ん中のツリー表示パネル上で"Package"を選択します。右側にPackage要素の属性が一覧表示されます。

Package要素に関する属性の定義
属性  内容  備考 
Comments MSI形式ファイルのプロパティ-詳細で閲覧できるコメント情報を記載する。(日本語で記述するときは属性SummaryCodepageの指定をしないと、MSIファイルのプロパティー詳細のコメント欄が文字化けした) 「This installer database contains the logic and data required to install HelloWix Sample.」
 Compressed MSI形式ファイルの圧縮有無。 デフォルトのままでよい 
 Description 製品の説明を記述する。(日本語で記述するときは属性SummaryCodepageの指定をしないと、MSIファイルのプロパティー詳細で件名欄が文字化けとなる) 「簡単なメッセージを標準出力に出力するバッチコマンド」
 InstallVersion 生成したMSI形式ファイルをインストール可能なWindows Installerバージョン デフォルトのままでよい 
SummaryCodepage*2 MSIファイルのプロパティー詳細で表示される文字コードの指定 日本語Windows標準に合わせて「932」に変更する

*2) WixEditのウィザード生成直後はSummaryCodepage属性が表示されていないので、"Package"を選択した状態で右側ペインの上で右クリックしポップアップメニューの[New]を選択、「New Attribute Name」ダイアログが表示されるので、"SummaryCodepage"を選択する。記述が終わった時点で以下の画面となる。

設定後の画面を以下に示します。

次に、インストールするファイルとインストール先のディレクトリについて設定を記述します。左側ペインの[Files]を選択します。

これはWix設定ファイルのDirectory要素のツリーを表したもので、トップレベル要素の"SourceDir"は必須項目となっています。"PFiles"は、ディレクトリのプロパティ ProgramFilesFolder で、通常C:\Program Filesを指します。

今回、インストール先はC:\Program Files\hellowixとするので、真ん中のツリー表示パネル上で"PFiles"を選択し、右クリックでポップアップメニューから[New]>[Directory]を選択します。

右側、Id欄の右側(画面では見えにくいですが、テキスト入力可能なエリア)をクリックし、"hellowix"を入力します。

ディレクトリは、一つ上のPFilesのように、IdとNameが必要です。ここではIdしか記述していないので、Nameを追加します。真ん中のツリー表示パネル上で"hellowix"を選択した状態で、Idの表示されている領域で右クリックしポップアップメニューから[New]を選択します。

一覧から[Name]を選択し[Ok]ボタンを押します。

ディレクトリ要素"hellowix"にName属性が追加されました。Name欄の右をクリックし、実際に作成するディレクトリ名"hellowix"を入力します。

インストール後の姿は、このhellowixディレクトリの下にファイルHelloWix.cmdを置きますが、WixのXMLではDirectory要素の子要素はComponent要素を置くので、真ん中のツリー表示パネル上で"hellowix"を選択し右クリックでポップアップメニューから[New]>[Component]を選択します。

Componentには、GuidとIdを記述するようです。Guidの右側をクリックすると、[...]ボタンが現れます。

Guid欄の右側の[...]ボタンを押してGUIDを自動生成します。

Id欄には、ファイル名と同じ"HelloWix.cmd"を記述します。1つのComponentには複数のファイルを対応づけられますが、ファイル1つに対応するようにComponentを作成するのがベストプラクティスとされています。

作成したコンポーネント"HelloWix.cmd"を選択し、右クリックでポップアップメニューから"Import Files"を選択し、作業ディレクトリに配置していたHelloWix.cmdを選びます。

次に、[Features]タブを選択します。

真ん中のツリー表示パネル上で"DefaultFeature"を選択し、右クリックでポップアップメニューから[New]>[ComponentRef]を選択します。

真ん中のツリー表示パネル上で"ComponentRef"を選択し、Id欄の右側をクリックすると、ドロップダウンボタン[▼]が表れます。

ドロップダウンボタンをクリックすると、既作成のComponentのID一覧が表れるので、指定します。


最初のサンプルに必要な設定を記述したので、設定ファイルを保存します。[File]メニュー>[Save]で、作業ディレクトリに"hellowix.wxs"の名前で保存します。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="A1302F32-6C23-48F1-A1BB-BA833CDD6C38"
           Name="HelloWixサンプル 1.0" Language="1041" Version="1.0.0"
           Manufacturer="高橋 徹"
           UpgradeCode="5C2E7363-E797-4B2E-B3D1-4B762F5C5E8E"
           Codepage="932">
    <Package Description="簡単なメッセージを標準出力に出力するバッチコマンド。"
             Comments="This installer database contains the logic and data required to install HelloWix Sample."
             InstallerVersion="200" Compressed="yes" />
    <Media Id="1" Cabinet="simple.cab" EmbedCab="yes" />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder" Name="PFiles">
        <Directory Id="hellowix" Name="hellowix">
          <Component Id="HelloWix.cmd"
                     Guid="3E23BA5F-5B49-4261-8391-33B7909E9DD8">
            <File Id="HELLOWIX.CMD" Name="HelloWix.cmd" Source="HelloWix.cmd" />
          </Component>
        </Directory>
      </Directory>
    </Directory>
    <Feature Id="DefaultFeature" Title="Main Feature" Level="1">
      <ComponentRef Id="HelloWix.cmd" />
    </Feature>
    <UI />
  </Product>
</Wix>

MSI形式ファイルの生成

XMLファイルからMSI形式ファイルを生成します。生成過程は次のとおりです。

XMLファイル (hellowix.wxs)
         | candleコマンド
         ↓
中間ファイル(hellowix.wixobj)
         | lightコマンド
         ↓
MSIファイル (hellowix.msi)

まず、candleコマンドで、XMLファイルから中間ファイルを生成します。

C:\work\hellowix> candle hellowix.wxs
Microsoft (R) Windows Installer Xml Compiler version 3.5.2519.0
Copyright (C) Microsoft Corporation. All rights reserved.

hellowix.wxs

C:\work\hellowix> dir /B
HelloWix.cmd
hellowix.wixobj
hellowix.wxs

C:\work\hellowix> 

次に、lightコマンドで、中間ファイルからMSI形式ファイルを生成します。

C:\work\hellowix> light -cultures:ja-jp hellowix.wixobj 
Microsoft (R) Windows Installer Xml Linker version 3.5.2519.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\work\hellowix> dir /B
HelloWix.cmd
hellowix.msi
hellowix.wixobj
hellowix.wixpdb
hellowix.wxs

C:\work\hellowix> 

Wix 3.5には、日本語リソースが含まれているので、-culturesオプションでロケールを指定することでインストーラの言語を指定することができます。-culturesを指定しないときは、デフォルトの英語になります。

インストーラの実行

では、実際にインストールを行ってみます。作成されたhellowix.msiを実行します。

Windows 7でUACを有効にしていると、ここで「ユーザーアカウント制御」ダイアログが表示されるので、[はい]を押して進めます。

インストールが完了すると自動でダイアログが消えます。確認がないので、気づかないかもしれません。

インストールされたかどうかを、Windowsのコントロールパネル > プログラムのアンインストール で見ると、以下のようにリストに載ってます。

インストール先に実際にファイルが入ったかをエクスプローラで確認してみます。

64bit OSでは、WiXのXMLでインストール先ディレクトリのIDに"ProgramFilesFolder"を指定した場合、C:\Program Files (x86) のように32bit用プログラム格納ディレクトリが適用されます。C:\Program Files のような64bit用プログラム格納領域を指定したいときは、ディレクトリのIDに"ProgramFiles64Folder"を指定します。

ただし、この指定をして作成したMSIファイルを32bit OSで実行した場合どうなるかは未確認です。

アンインストールの実行

コントロールパネルのプログラムのアンインストール上で、HelloWixサンプル 1.0をダブルクリックします。

Windows 7でUACを有効にしていると、ここで「ユーザーアカウント制御」ダイアログが表示されるので、[はい]を押して進めます。

インストール先を変更可能とするUIを付ける

最初のサンプルは、インストール先の変更ができないため、実際に使うには不便です。

WixEditで、UIの追加設定

WixEditを立ち上げ、[File] > [Open] で最初のサンプル hellowix.wxs を開きます。

左側パネルで[Global]を選択、真ん中のツリー表示パネル上で"Product"を選択し、右クリックでポップアップメニューから[New] > [UIRef]を選択します。Product要素の子要素UIRefが作成されます。

真ん中のツリー表示パネル上で"UIRef"を選択し、右側のId欄に"WixUI_InstallDir"を記述します。

左側表示パネル上で"Properties"を選択し、右側表示パネルで右クリックしポップアップメニューで"Add New"を選択します。

「Enter Resource Name」ダイアログが表れるので、"WIXUI_INSTALLDIR"を入力し[Ok]ボタンを押します。

WIXUI_INSTALLDIR欄の右側をクリックし、"hellowix"を入力します。ここで入力する文字列("hellowix")は、ディレクトリ要素のツリーで変更可能としたいディレクトリ要素のidを指定します。このサンプルでは、ディレクトリツリー PFiles>hellowix の中でhellowix(id="hellowix") を変更可能としています。

[File]メニュー > [Save]を選択してXMLファイル(hellowix.wxs)を保存します。

XMLファイル上での違いを以下にdiff形式で示します。

$ bzr diff hellowix.wxs 
=== modified file 'hellowix.wxs'
--- hellowix.wxs        2011-05-28 15:14:56 +0000
+++ hellowix.wxs        2011-05-28 23:53:54 +0000
@@ -16,5 +16,7 @@
             <ComponentRef Id="HelloWix.cmd" />
         </Feature>
         <UI />
+        <UIRef Id="WixUI_InstallDir" />
+        <Property Id="WIXUI_INSTALLDIR" Value="hellowix" />
     </Product>
 </Wix>

MSI形式ファイルの生成

追加修正したhellowix.wxsからMSIファイルを生成します。

まず、candleコマンドを実行し、中間ファイルを生成します。これは前回と同じです。

C:\work\hellowix> candle hellowix.wxs
Microsoft (R) Windows Installer Xml Compiler version 3.5.2519.0
Copyright (C) Microsoft Corporation. All rights reserved.

hellowix.wxs

C:\work\hellowix> dir /B
HelloWix.cmd
hellowix.wixobj
hellowix.wxs

C:\work\hellowix> 

次に、lightコマンドで、中間ファイルからMSI形式ファイルを生成します。UIRefを追加した場合、オプション指定”-ext WixUIExtension"が追加で必要になります。

C:\work\hellowix> light -ext WixUIExtension -cultures:ja-jp hellowix.wixobj 
Microsoft (R) Windows Installer Xml Linker version 3.5.2519.0
Copyright (C) Microsoft Corporation. All rights reserved.

C:\work\hellowix>

インストーラの実行

では、UIRefを追加したものでインストールを行ってみます。作成されたhellowix.msiを実行します。

[次へ]ボタンを押します。

ライセンス承諾画面が出ます。[使用許諾契約書に同意します]をチェックすると[次へ]ボタンを押せるようになるので、チェックを付けてから、[次へ]ボタンを押します。

なお、ここでは、WiXのライセンスであるCPLがデフォルトで使われておりますが、本来はインストール対象の製品のライセンスを表示する必要があります。ライセンスの設定は次の章で解説します。

インストール先の指定ができるようになりました。直接ディレクトリ名を修正するか、[変更...]ボタンを押して、ファイル選択ダイアログでインストール先を指定します。

インストール先を変更してみました。

[完了]ボタンを押すと、インストール終了です。

使用許諾の内容を変更する

デフォルトでは使用許諾の内容は、CPL(Common Public License)となっています。これは、WiXのライセンスですので、実際に製品に適用するライセンス文面に変更する必要があります。

ライセンス文面の準備(RTF形式)

ライセンス文面をRTF形式のファイルで用意します。RTF形式はWindowsに標準で搭載されているワードパッドで作成することができます。

ここでは、MITライセンスの文面を使って以下のテキストを、RTF形式で保存可能なツール(ここではワードパッド)上で作成します。

The MIT License

Copyright (c) 2011 TAKAHASHI,Toru

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

これを、名前を付けて保存で、リッチテキスト ドキュメント形式でlicense-mit.rtfに保存します。

WixEditでライセンス文面の設定記述を追加

WixEditを立ち上げ、[File] > [Open] で最初のサンプル hellowix.wxs を開きます。

左側パネルで[Global]を選択、真ん中のツリー表示パネル上で"Product"を選択し、右クリックでポップアップメニューから[New] > [WixVariable]を選択します。

Product要素の子要素WixVariableが作成されます。

右側のId欄およびValue欄にそれぞれ"WixUILicenseRtf"、"license-mt.rtf"を記述します。

[File]メニュー>[Save]で保存します。

MSI形式ファイルの生成

追加修正したhellowix.wxsからMSIファイルを生成します。

candleコマンドを実行し、中間ファイルを生成します。これは前回と同じです。

C:\work\hellowix> candle hellowix.wxs

lightコマンドで、中間ファイルからMSI形式ファイルを生成します。前回と同じです。

C:\work\hellowix> light -ext WixUIExtension -cultures:ja-jp hellowix.wixobj 

インストーラの実行

WixVariable要素を追加して生成したインストーラを実行します。

使用許諾のダイアログに表示される文面が、指定した内容に変更されています。

64bitソフトウェアのインストーラ作成

日記に64bit版インストーラ作成の試行錯誤を書いています。

64bit版OSでは、C:\Program Files\ディレクトリにインストールできるソフトウェアは64bit版に限定され、32bit版はC:\Program Files (x86)\下か他のディレクトリにしか入れられません。

C:\Program Files\下にインストールしたいソフトウェアは、64bit版としてインストーラを作成します。

なお、32bit版/64bit版を1つにまとめたインストーラは作成が難しく、基本は別々に作成します。

64bit版のインストーラを作成するには、次の2つの方法があります。

64bitコンポーネントを明示的に指定

なお、32bit、64bitを両方作成するソフトウェアについては、同時にインストールすることを想定すれば各GUIDは別に作成する必要があります。

簡易に指定

複数のファイル(サブディレクトリ)を扱う - WixEdit編

今までのサンプルの作成では、ファイル/ディレクトリが少ないため、WixEdit上でDirectory要素を1つ1つ作成し、Component要素を1つ1つ作成し、さらにFeatures要素の下にComponentRef要素を作成したComponent数分作成しても大した作業ではありませんでした。

しかし、ディレクトリ階層を持つ複数のファイルを指定する場合、1つ1つ作成するのは手間なので、まとめてインポートします。

作業準備ーディレクトリ/ファイル構成

HelloWixに、ディレクトリ階層を追加します。

C:\work\hellowix
          +-- HelloWix.cmd
          +-- doc
                +-- README.txt
                +-- plain
                |     +-- HowToHelloWix.txt
                +-- pdf
                |     +-- HowToHelloWix.pdf
                +-- html
                      +-- HowToHelloWix.html
                      +-- images
                            +-- wallpaper.gif
                            +-- wix.gif          

Wixで指定ディレクトリ以下をまとめてインポート

左側パネルで[Files]を選択、真ん中のツリー表示パネル上でインポートしたいディレクトリの直上のディレクトリである"hellowix"を選択し、右クリックでポップアップメニューから[Import Folder]を選択します。

すると、「Browse For Folder」ダイアログが表示されます。

インポートしたいディレクトリを選択し[OK]ボタンを押します。

指定した"doc"フォルダが追加されています。展開すると以下のようにサブディレクトリを含めてインポートされているのが分かります。

次に[Features]タブを選択します。

残念ながら、インポートしたフォルダのコンポーネント(ComponentRef)は生成されていません。

真ん中のツリー表示パネル上で"DefaultFeature"を選択し、右クリックでポップアップメニューから[Select Components to add]を選択します。

定義済みのComponent要素が一覧されるので、複数選択し(1つ1つクリックして選択)、[Ok]ボタンを押します。

注記)まとめて選択する操作が見いだせませんでした。クリックすると選択状態と選択解除状態が切り替わるだけです。

複数のファイル(サブディレクトリ)を扱う - heat編

WixEditの"Import Folder"機能でも、数十個を越えるファイル群や、複数のディレクトリ階層を別々に扱い場合、対応が困難になります。

そこで、heatコマンドを使い、指定したディレクトリ以下のディレクトリ/ファイルを走査してXMLデータをファイルに生成させ、そのファイルと合わせてインストーラを作成する方法を採ります。

heatコマンドでディレクトリ階層からFragment情報を生成する

heatコマンドを使って、docディレクトリ以下の階層にあるディレクトリ/ファイルからインストール情報のXMLを生成します。XMLファイルは別ファイルとして、構成変更があっても簡単に対応できるようにします。Wixでは、Fragment要素がこの目的で使えます。

C:\work\hellowix> heat dir doc -dr DOC -cg Documents -gg -g1 -sfrag -srd 
 -var "var.documentsDir" -out hellowix_files.wxs

heatのオプションは少々複雑で多岐にわたっています。ここで指定しているオプションは、書籍「WiX: A Developer's Guide to Windows Install XML」の"Harvesting files with heat.exe"で紹介しているものです。

 オプション  内容  備考
dir ディレクトリパス
ディレクトリを対象とする  heatの第1引数には、以下のいずれかを指定することが必須。
dir | file | perf | project | website
ディレクトリパスは生成するwxsファイルに記述されるので、wix実行ディレクトリからの相対パスを指定(カレントディレクトリの'.'指定も可)
-dr ディレクトリID
ディレクトリ参照  採取したディレクトリ/ファイルの構成(Component要素)がどのDirectory要素にぶら下がるかをIDで指定。このIDを持つディレクトリはWixEditのプロジェクトで作成する。
注)-cgオプションより先に-drオプションを指定する
-cg 名前
ComponentGroupの名前  採取したディレクトリ/ファイル構成全体を1つのComponentGroupに束ね、その名前(ID)を指定。このIDはWixEditのプロジェクトでComponentGroupRefとして使用する。 
-gg
GUIDを一緒に生成する   
-g1
GUIDを波括弧で囲わない   
-sfrag
Fragmentを複数生成しない  Component毎にFragmentを生成しないようにする。 
-srd
ファイルが存在するディレクトリ自身は採取しない  WixEditのプロジェクトから利用する場合、トップディレクトリはWixEdit側で作成した方が都合がよいので本オプションを指定する。 
-var 変数名
SourceDirを置き換える変数を指定  デフォルトではファイルのパスがSourceDir/aaa/bbbと先頭がSourceDirで生成され、後でlight.exe実行時にファイルが存在しないエラーになる。そこで、SourceDirではなく変数として後にcandle.exeの引数で実パスを指定できるようにする。

ここでは、docディレクトリ以下のサブディレクトリを含むファイル構成をインストール対象としたい(Component要素およびFile要素として指定したい)ので、第1引数には"dir"を指定します。

ファイル構成は、docディレクトリの下になるので、helloWix.wxsで作成するdocディレクトリのDirectory要素のId属性"DOC"を-drオプションで指定します。-drオプションを指定すると、<DirectoryRef>が生成されます。

heatで生成したXMLファイルに含まれるComponent要素は、-cgで指定した名前のComponentGroup要素に含まれます。helloWix.wxsのFeaturesでこれをComponentGroupRefで指定します。

生成したComponent要素のGuid属性に、自動的に作成したGUIDを埋めます。-ggオプションを省略すると、後で手作業でGUIDを生成してまわる手間がかかります。

Guidを生成するとき、波括弧で囲まれるのを抑制するため、-g1オプションを指定します。

-sfragオプションを指定しないと、多数のFragment要素が生成されるので、指定します。

-srdオプションを指定しないと、-drで指定した基点ディレクトリが<Directory>要素として生成されるので、ここでは指定します。

-varオプションを指定しないと、生成されるFile要素のSource属性がSourceDirで始まるが、実在しないディレクトリなのでcandle/lightがエラーとなります。SourceDirを抑止し、替りにここで指定した変数名をSource属性で使用します。変数はcandleコマンド実行時にコマンドラインオプションで値を指定します。変数名は、"var.名前"と指定し、後にcandleコマンドのオプションで-d名前 で指定します。

生成されたhellowix_files.wxsの例を次に示します。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="DOC">
            <Component Id="cmp77761ECF8679B4C62AE2A6AB3FE92B05" Guid="0B7F8780-775F-43D3-A14C-CB0EF0073F2D">
                <File Id="filCF60C4117B50F933FBC3B2E0F8FD1030" KeyPath="yes" Source="$(var.documentsDir)\README.txt" />
            </Component>
            <Directory Id="dirAACD65895408F857FFA8BF0BB6A9DFAF" Name="html">
                <Component Id="cmpF0046594662B478047A79FF16B7E65FD" Guid="649BC99F-0F46-4D8C-A9B1-4A52E2D5276E">
                    <File Id="fil51532D04410AC4E3DC02A852999ADDDB" KeyPath="yes" Source="$(var.documentsDir)\html\HowToHelloWix.html" />
                </Component>
                <Directory Id="dir4D8B3CCBDA9F0DC1FC8529B055448E3E" Name="images">
                    <Component Id="cmpE6742917029449A18F374AD6F96701F3" Guid="5951687A-201E-4719-8A94-4A44C18AB25D">
                        <File Id="fil16E3AF1B3438C75A0D31B4CA5E53603D" KeyPath="yes" Source="$(var.documentsDir)\html\images\wallpaper.gif" />
                    </Component>
       :(中略)
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="documents">
            <ComponentRef Id="cmp77761ECF8679B4C62AE2A6AB3FE92B05" />
            <ComponentRef Id="cmpF0046594662B478047A79FF16B7E65FD" />
            <ComponentRef Id="cmpE6742917029449A18F374AD6F96701F3" />
            <ComponentRef Id="cmpD5D3D8EA07E3D8EC4C41D4A66AE7BA28" />
            <ComponentRef Id="cmp06108C2A6777B6537A5FCE19AC1E21BC" />
            <ComponentRef Id="cmp94765247247F4153524C01B85AB5AAF0" />
        </ComponentGroup>
    </Fragment>
</Wix>    

hellowix.wxs とheatで生成したファイルの整合を取る

hellowix.wxs側には、以下の2点が反映されていることを確認します。

  1. heatで生成するときに-drオプションで指定したディレクトリIDが定義されている
  2. headで生成するときに-cgオプションで指定したComponentGroupのIDをFeaturesでComponentGroupRef要素を使って参照している

WixEditで、左側パネルで[Files]を選択、真ん中のツリー表示パネル上で"hellowix"を選択し、右クリックでポップアップメニューから[New] > [Directory]を選択します。

真ん中のツリー表示パネル上で、"hellowix"の下に"Directory"という名前で新規作成したディレクトリが表れるので、これを選択し、右側パネルでId欄に"DOC"を入力します。・・・確認(1) heatの-drで指定したディレクトリIDと一致すること。

右側パネルで右クリックしポップアップメニューから[New]を選択、表れた"New Attribute Name"ダイアログで[Name]を選択し[Ok]ボタンを押します。右側パネル上でName欄に"doc"を入力します。

次に、[Features]タブを選択し、真ん中のツリー表示パネル上で"DefaultFeature"を選択し、右クリックでポップアップメニューから[New] > [ComponentGroupRef]を選択します。

右側表示パネルのId欄に、"Documents"を入力します。・・・確認(2)、-cgで指定したコンポーネントグループ名と一致すること。

MSI形式ファイルの生成(コマンド編)

修正したhellowix.wxsとheatコマンドで生成したhellowix_files.wxsからMSIファイルを生成します。

candleコマンドを実行し、中間ファイルを生成します。hellowix_files.wxsを処理するときは、変数に実体を指定します。

C:\work\hellowix> candle -nologo hellowix.wxs
hellowix.wxs

C:\work\hellowix> candle -nologo -ddocumentsDir=doc hellowix_files.wxs
hellowix_files.wxs

C:\work\hellowix> 

lightコマンドで、中間ファイルからMSI形式ファイルを生成します。前回と同じです。

C:\work\hellowix> light -nologo -ext WixUIExtension -cultures:ja-jp hellowix.wixobj hellowix_files.wixobj -out hellowix.msi

C:\work\hellowix>

インストーラの実行は今までどおりです。

MSI形式ファイルの生成をWix Editのビルドメニューから行う

コマンドラインの実行は不便です。そこで、Wix Editの[Build]メニュー > [Build MSI setup pacakge]で生成できるよう、ビルドで実行するコマンド定義を修正します。

Wix Editの[Build]メニュー > [Build Settings]を選択し、「Edit Settings」ダイアログを表示します。

Candle.exeおよびLight.exeのコマンド実行を定義できます。チェックを付けるとコマンドライン定義を編集できるようになるので、それぞれチェックを付けて変更します。

記述した定義は次のとおりです。

Candle.exeのコマンドライン

"<projectfile>" "<projectname>_files.wxs" <extensions> -dsourceDir=.

Light.exeのコマンドライン

"<projectname>.wixobj" "<projectname>_files.wixobj" -out "<projectname>.msi" <extensions> -cultures:ja-jp

パッチ用のインストーラ

既にインストールした製品について、一部分を差し替えるような、いわゆるパッチを作成します。パッチ用インストーラは拡張子が.mspとなるもので、ソフトウェアの一部のファイルを差し替えたり、追加ファイルをインストールします。

Windowsのインストーラには、インストールした製品の更新には次の3種類があります。

  1. メジャー・アップグレード(大きな改修)
  2. マイナー・アップグレード(小さな改修)
  3. スモール・アップデート(ちょっとした更新)
 更新種類 製品IDの変更  バージョン番号の変更  パッチファイル(.msp)の可否 
 メジャー・アッグレード
(大改修)
 あり  あり  否
 マイナー・アップグレード
(小改修)
 なし  あり  可
 スモール・アップデート
(ささいな更新)
 なし  なし  可

ここでは、スモールアップデートを行ってみます。

作業準備ー更新対象ファイルの修正

HelloWixの構成ファイルのうち、以下のファイルを修正します。

C:\work\hellowix
          :
          +-- doc
          :     +-- README.txt

パッチでは、インストーラとしてこの変更分だけを含んだ小さなインストーラを作成します。

パッチインストーラ作成用のXML記述

WixEditでは作成できないと思われるので、エディタで1から記述します。といっても記述量は少ないです。

なお、このパッチファイルおよびパッチ作業は、別ディレクトリで作業するように、とのことで(書籍によれば)、

C:\work\hellowix-patch1
          +-- hellowix-patch1.wxs

としておきます。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Patch AllowRemoval="yes"
         Classification="Update"
         Comments="Patch for HelloWix Sample v. 1.0.0"
         Description="Updates document top file of HelloWix Sample v. 1.0.0"
         DisplayName="HelloWix Sample Patch 2011-05-30"
         Manufacturer="高橋 徹"
         Codepage="932">

    <Media Id="1000" Cabinet="MyPatch.cab">
      <PatchBaseline Id="MyPatch" />
    </Media>

    <PatchFamily Id="MyPatchFamily"
                 Version="1.0.1"
                 ProductCode="A1302F32-6C23-48F1-A1BB-BA833CDD6C38"
                 Supersede="yes">
      <ComponentRef Id="cmp77761ECF8679B4C62AE2A6AB3FE92B05" />
    </PatchFamily>
  </Patch>
</Wix>

Wix要素の子要素Patchに必要な情報を定義します。

AllowRemoval属性は、このパッチを適用した後、パッチだけを外すことができるかを"yes"、"no"で指定します。パッチを外す指定にした場合、以下のコマンドでパッチを外します。

msiexec /i hellowix.msi MSIPATCHREMOVE=C:\work\hellowix-patch1.msp

Classification属性は、パッチの分類を指定します。以下の選択肢があります。
Critical Update, Hotfix, Security Rollup, Security Update, Service Pack, Update, Update Rollup

Comments属性とDescription属性にはパッチに関する詳細情報を記述します。

DisplayName属性はパッチファイルについてユーザーに分かりやすい名前を記述します。

Manufacturerはソフトウェア製作者/開発会社を記述します。

ここには記載していませんが、MoreInfoURL属性、TargetProductName属性も記述できます。

Media要素のId属性には、パッチ対象のMSIファイルに適用されたMedia要素のId属性値よりも大きい値を指定します。
Cabinet属性には好きな名前を指定できます。

PatchBaseline要素のId属性には、後でコマンドでパッチを生成するときに指定する名前を指定します。Media要素のCabinet属性の名前(.cabを除外したもの)と同じにしておくとよいでしょう。

PatchFamily要素は、パッチを適用する対象ソフトウェアを定義します。Id属性にはこのPatchFamilyに付ける名前を記述します(多分なんでもよい)。
Version属性は、パッチ適用順番を規定し、Product要素のバージョン番号をセットします(らしいがうまくいってないみたい)。
ProductCode属性は、パッチ対象ソフトウェアのProduct要素のId属性で指定したGuidと一致させます。
Supersede属性は、"yes"にすると、このパッチがすでに適用済みパッチを上書きする際に通知するようにします。

PatchFamily要素の子要素ComponentRefは、パッチ対象のMSIファイル作成時に定義したコンポーネント(ファイル)のうち、更新したいものを指定します。

修正版のインストーラ作成

まず、修正前の.wxipdbファイルを別名で保存しておきます。

C:\work\hellowix> ren hellowix.wixpdb hellowix_old.wixpdb

C:\work\hellowix>

従来どおりの手順で、修正したファイルを含むインストーラを作成します。

C:\work\hellowix> candle -nologo hellowix.wxs
hellowix.wxs

C:\work\hellowix> candle -nologo -ddocumentsDir=doc hellowix_files.wxs
documents.wxs

C:\work\hellowix> light -nologo -ext WixUIExtension -cultures:ja-jp hellowix.wixobj hellowix_files.wixobj -out hellowix.msi

C:\work\hellowix>

パッチ情報を記述した hellowix-patch1.wxs を処理します。

C:\work\hellowix> cd ..\hellowix-patch1

C:\work\hellowix-patch1> candle -nologo hellowix-patch1.wxs
hellowix-patch1.wxs

C:\work\hellowix-patch1> light -nologo hellowix-patch1.wixobj

C:\work\hellowix-patch1>

ここで、元のディレクトリに戻り、修正前後の差分情報を生成します。 

C:\work\hellowix-patch1> cd ..\hellowix

C:\work\hellowix> torch -p -xi hellowix_old.wixpdb hellowix.wixpdb -out ..\hellowix-patch1\hellowix-patch1.wixmst

C:\work\hellowix>

パッチ作業ディレクトリに戻り、パッチインストーラを作成します。 

C:\work\hellowix> cd ..\hellowix-patch1

C:\work\hellowix-patch1> pyro hellowix-patch1.wixmsp -t MyPatch hellowix-patch1.wixmst -out hellowix-patch1.msp

C:\work\hellowix-patch1>

なお、pyroコマンドのオプション-tで指定している名前"MyPatch"は、hellowix-patch1.wxsのPatchBaseline要素で指定したものと合わせます。

WixEdit上からcandleコマンド、lightコマンドの実行

WixEditの[Build]メニュー>[Build MSI setup package]でMSIファイルが生成できると便利です。

ですが、WixEdit 0.7.5.0 はデフォルトでは内蔵のWix 3.0を実行するので、今回のWix3.6のビルドはエラーとなります。そこで、WixEditから使用するWixを内蔵のものではなく別途インストールした Wix 3.5を使用するように設定します。

まず、[Tools]メニュー > [Options]を選択します。

「Options」ダイアログが表示されます。

[Wix Binaries Directory] 欄のパスを、Wix 3.5インストールディレクトリ下のbinに設定します。

[Wix Binaries Version]欄の数値が、3.6に変わっていればOKです。

[OK]ボタンを押し、「WiX Edit Settings」ダイアログを閉じます。

lightコマンドのオプション指定を行います。[Build]メニュー > [Build Settings]を選びます。

「Edit Settings」ダイアログが表示されます。

[Use custom commandline for Light.exe]にチェックを付けます。コマンドライン記述欄が編集可能状態になります。

-cultures:ja-jp

などを追記します。

ディレクトリにアクセス権を設定する

複数のログインユーザーの間でプログラムが読み書きするデータを共有する場合、データを置くディレクトリに、あらかじめどのユーザーでも読み書き可能な権限を設定しておく必要があります。さもなければ、あるユーザーがプログラムを実行して保存したデータを、別なユーザーが変更しようとしてもアクセスエラーとなってしまいます。

まず、以下のインストールを行うとします。

C:\
 +-- Program Files
 |       +-- hellowix
 |               +-- HelloWix.cmd
 +-- ProgramData
         +-- hellowix

C:\ProgramData\hellowix の下に、プログラムがデータを置き、使用するユーザーでデータを共有します。

まず、[SourceDir]を選択し、[New]>[Directory]で、C:\ProgramDataを示す CommonAppDataFolderをId属性に、名前は適当なPDataとしたディレクトリを作成します。

次に、PDataの下に、同様に[New]>[Directory]で、hellowixの名前のディレクトリを生成します。Idは、PFiles下のものとかぶらないよう、ここではhellowixDataとでもしておきます。

ここで、PData下のhellowixにアクセス権を設定しないと、C:\ProgramData\hellowixの下にあるユーザーがデータを作成し、別なユーザーがデータを変更しようとするとエラーとなります。

組み込みのUsersグループを設定する

ユーザーを新規作成すると、Usersグループに属するので、まずはUsersグループの権限を指定します。

アクセス権を設定するには、ディレクトリにコンポーネント要素を付け、そのコンポーネント要素の子要素にCreateFolderを付け、そのCreateFolderの子要素にPermissionを付けます。

ディレクトリに対するPermissionは、AdministratorsグループとUsersグループの2つを付けることとします。

ディレクトリにコンポーネント要素を付ける

まず、PData下のhellowixを右クリックし、[New]>[Component]を選択し、右側で右クリックし[New]を選択、「New Attribute Name」ダイアログからGuidとIdを選択し、[Ok]を押します。

Guid欄の右端にある[...]ボタンを押し、GUIDを自動生成します。Id欄には、適当な名前PDataHellowixPermissionを入力しました。

ディレクトリのコンポーネント要素にCreateFolder要素を付ける

このコンポーネントPDataHellowixPermissionを右クリックし、[New]>[CreateFolder]を選択します。

CreateFolderにAdministratosグループのPermissionを付ける

CreateFolderを選択して右クリック、[New]>[Permission]を選択します。

1つ目のPermissionには、属性GenericAllと属性Userを付けます。

GenericAllはyesかnoを選択するのでyesを指定、UserにはAdministratorsを指定します。

CreateFolderにUsersグループのPermissionを付ける

もう一度、CreateFolderを選択して右クリック、[New]>[Permission]を選択します。

2つ目のPermissionには、属性Userと、以下画面のように複数のアクセス属性を付けます。

アクセス属性は多数用意されており、どれを設定するのか迷います。Windowsのファイル・セキュリティをじっくり調べて確認するしかないようです。

たとえば、以下ページなどです。

インストール後のフォルダの実際のアクセス権

PowerShellのコマンドで、実際にインストールして生成したC:\ProgramData\hellowixフォルダのアクセス権を調べてみると、以下のとおりでした。

PS C:\> Get-Acl C:\ProgramData\hellowix | Format-List

Path   : Microsoft.PowerShell.Core\FileSystem::C:\ProgramData\hellowix
Owner  : NT AUTHORITY\SYSTEM
Group  : NT AUTHORITY\SYSTEM
Access : NT AUTHORITY\SYSTEM Allow  FullControl
         BUILTIN\Administrators Allow  FullControl
         BUILTIN\Users Allow  Modify, Synchronize
Audit  :
  :

環境変数を設定する

インストール時に環境変数を定義し、アンインストール時に環境変数を削除します。

コンポーネント要素にEnvironment要素を追加する

環境変数の設定は、インストールするコンポーネント要素の子要素にEnvironment要素を定義します。

ディレクトリ要素にはEnvironment要素を子要素として加えられません。

  1. 既存のコンポーネントのいずれか1つを選んで子要素にEnvironmentを追加
  2. ディレクトリに新しいコンポーネントを作成し、そのコンポーネントの子要素にEnvironmentを追加
    この場合、[Features]タブを選択し、DefaultFeatureを右クリック、[Select Component to add]を選択、作成したコンポーネントを指定します。

以下は1.の方法での手順です。

まず、PFiles下のhellowix下にあるコンポーネントHelloWix.cmdを右クリックし、[New]>[Environment]を選択します。HelloWix.cmdの下に、Environmentが生成されます。

フォルダにコンポーネントを追加し環境設定をする場合

ディレクトリ要素にComponent

Environment要素の属性を設定する

IDは任意の識別子(次のNameと同一でいいでしょう)、Nameには設定したい環境変数名を記述します。

ここでは、環境変数「HELLOWIX_BIN」を定義しています。

次に、Environmentを選択した状態で、右側ペイン上で右クリックし、ポップアップメニューから[New]を選択します。

環境変数をユーザー環境変数として定義する場合、System属性にnoを指定、システム環境変数として定義する場合、System属性にyesを指定します。(デフォルトはno)

環境変数をアンインストール時に削除する場合、Permanent属性にnoを指定、アンインストール後も定義し続ける場合、Permanent属性にyesを指定します。なお、Part属性にfirstまたはlastを指定してインストールした場合、削除するのは追加した設定部分のみで環境変数自体を削除することはありません。

インストール時に既に設定する環境変数が定義されていたとき、そのままにしておき変更しない場合はAction属性にcreateを指定、この値に変更する場合は属性にsetを指定します。

インストール時に環境変数を削除したい場合は、Action属性にremoveを指定します。この場合、Value属性が存在すれば、環境変数を削除するのは変数の値がValue属性の値と一致したときのみ環境変数を削除します。Value属性が未定義なら、環境変数は値によらず削除します。

既存の環境変数があったとき、その値を全面置き換え/値の先頭に追加/値の末尾に追加を選択できます。Part属性に指定するのは順にall/first/last となります。

環境変数の設定値はValue属性に文字列で指定します。インストーラによってインストールするディレクトリを設定したい場合、事前には固定できないので、WiXの設定で定義したフォルダIDを角括弧('['、']')で囲って指定します。

今回は、システム環境変数としてHELLOWIX_BINを定義し、その値にはHelloWixをインストールしたディレクトリ(PFiles下のhellowix)を充てるように設定します。

ここで、HelloWixをインストールするディレクトリは、インストール時にユーザーが変更可能です。そこで、固定値ではなく、インストーラの実行結果で決まる値になるディレクトリ(hellowix)のIDを角括弧で指定しています。