Windowsアプリケーションを作成したので、せっかくなのでインストーラも作成してみようと思いました。
市販のものは高価でとても買うことはできないし、フリーのものでも使ってみるかと思って、
検索したところWiXをたまたま見つけてたので使ってみることにしました。
WiXの使い方については、以下のサイトを参考にさせてもらいました。
CodeZine・・・連載記事がありました。
wiki・・・WiX@wikiに解説がありました。
日本語のサイトがあまりないようなので、これらのサイトはとても参考になりました。
こらから使う方は、一度読んでみるとよいと思います。
インストーラの作成に必要となるツールをダウンロードする必要があります。
(ダウンロードする公式サイトから行いました。)
今回は、「wix-2.0.5805.0-binaries」のバージョンを使用しました。
zipファイルをダウンロードして、好きな場所に解凍するだけでした。
※バージョン3.0というのもあるみたいですが、まだ安定版(stable)がなかったようなのでバージョン2.0を使いました。
今(2009/12/13確認)は、バージョン3.0の安定版(stable)もあるようです。
インストーラの作成は、ファイルにインストーラの動作を記述し、
コマンド(コマンドプロンプト)でコンパイルするので、パスの設定が必要になると思います。
コマンドプロンプトを起動し、WiXを解凍したフォルダのパスを設定してください。
例)「D:\」にWiXを置いた場合
コマンドプロンプトで以下のコマンドを実行してください。
set path=%PATH%;d:\wix-2.0.5805.0-binaries
※この方法でのパスの設定は一時的なものになります。コマンドプロンプトを閉じて、再度起動した場合には無効となります。
以下のようなインストーラを作成しました。
・インストール先をユーザが選択できる。
・インストール後のフォルダ構成は下記のようになる。
・アンインストールすると(Assistant以下の)全てのフォルダが削除される。
Assistant(フォルダ)
├ Assistant.exe(実行ファイル)
├ Readme.txt(テキストファイル)
├ AsaWeeklyReport(フォルダ)
└ AssistantData(フォルダ)
├ AsaDaily(フォルダ)
└ AsaSchedule(フォルダ)
※「Assistant」、「AsaWeeklyReport」、「AsaDaily」、「AssistantData」、「AsaSchedule」
はインストール時にフォルダを新規に作成します。
インストーラは拡張子「wxs」というファイルにXMLを使用して作成するそうで、
そのファイルをコンパイル、リンクして「MSI(Microsoft Windows Installer)」を作成することになります。
コンパイル、リンクのコマンドは
コンパイル:candle *.wxs
リンク:light *.wixobj -out *.msi wixui.wixlib -loc WixUI_en-us.wxl
※「*.wixobj」はコンパイルされることにより、「*.wxs」ファイルから生成されるファイルです。
実際には、「Assistant.wxs」ファイルから「Assistant.msi」を作成したので、コマンドは、
コンパイル:candle Assistant.wxs
リンク:light Assistant.wixobj -out .\wix-2.0.5805.0-binaries\Assistant.msi .\wix-2.0.5805.0-binaries\wixui.wixlib -loc WixUI_en-us.wxl
となります。
作成した「Assistant.wxs」の内容です。
実際に動作させて、どうのように動くのか探りながら行ったので、
正しいのかは残念ながら不明です。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
<Product Id="????????-????-????-????-????????????"
Name="Assistant"
Version="1.0.0"
Manufacturer="Sagami Design Corporation"
Language="1041"
Codepage="932">
<!-- Installer Property -->
<Package Id="????????-????-????-????-????????????"
Description="Assistant Instraller"
Comments="Assistant Instraller"
Compressed="yes"
Manufacturer="Sagami Design Corporation"
Keywords="Installer,MSI,Database"
Languages="1041"
SummaryCodepage="932"/>
<Media Id="1" Cabinet="disk1.cab" EmbedCab="yes"/>
<Directory Id="TARGETDIR" Name="Source">
<Directory Id="DIR1" Name="dir1" LongName="Assistant">
<Component Id="COMPONENT1" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a1" DiskId="1">
<CreateFolder/>
<File Id="EXEFILE" Name="Assistan.exe" LongName="Assistant.exe"/>
<File Id="README" Name="Readme.txt"/>
<RemoveFile Id="EXEFILE" On="uninstall"/>
<RemoveFile Id="README" On="uninstall"/>
<RemoveFolder Id="DIR1" On="uninstall"/>
</Component>
<Directory Id="DIR2" Name="dir2" LongName="AsaWeeklyReport">
<Component Id="COMPONENT2" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a2" DiskId="1">
<CreateFolder/>
<RemoveFolder Id="DIR2" On="uninstall"/>
</Component>
</Directory>
<Directory Id="DIR3" Name="dir3" LongName="AssistantData">
<Component Id="COMPONENT3" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a3" DiskId="1">
<CreateFolder/>
<RemoveFolder Id="DIR3" On="uninstall"/>
</Component>
<Directory Id="DIR4" Name="dir4" LongName="AsaDaily">
<Component Id="COMPONENT4" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a4" DiskId="1">
<CreateFolder/>
<RemoveFolder Id="DIR4" On="uninstall"/>
</Component>
</Directory>
<Directory Id="DIR5" Name="dir5" LongName="AsaSchedule">
<Component Id="COMPONENT5" Guid="ff746e5c-441b-4772-9fdf-52a105ec37a5" DiskId="1">
<CreateFolder/>
<RemoveFolder Id="DIR5" On="uninstall"/>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
<Feature Id="MAINFEATURE" Level="1">
<ComponentRef Id="COMPONENT1"/>
<ComponentRef Id="COMPONENT2"/>
<ComponentRef Id="COMPONENT3"/>
<ComponentRef Id="COMPONENT4"/>
<ComponentRef Id="COMPONENT5"/>
</Feature>
<!-- Select UI -->
<UIRef Id="WixUI_ErrorProgressText"/>
<UIRef Id="WixUI_InstallDir"/>
<Property Id="WIXUI_INSTALLDIR" Value="TARGETDIR"/>
</Product>
</Wix>
実際に使ってみて、どうやってやるのか困った点です。
〓〓〓 インストール先を選択するために 〓〓〓
インストール先を選択するときに、デフォルトのパスを指定する必要があるようでした。
指定は、
Property Id="WIXUI_INSTALLDIR" Value="TARGETDIR"
で行います。
「Value="TARGETDIR"」がデフォルトのパスになるようです。
「TARGETDIR」とするとデフォルトのパスは「c:\」となりました。
「Value」には「C:\」のようにパスを指定することはできませんでした。
ここの指定が正しくできていないとインストール時に下記のようなエラーが出ました。
The installer has encountered an unexpected error installing this package.
This may indicate a problem with the package.
The error code is 2343.
〓〓〓 ファイル名について 〓〓〓
ファイル名はWindowsの制約により「8.3形式」となっているそうです。
そのため、ファイル名は「8文字」、拡張子は「3文字」で指定することになります。
Fileタグでファイル名を指定する場合には、
Nameにはショートファイル名(8.3形式)のみしか設定できませんでした。
長いファイル名を指定する場合には、「LongName」を使用する必要がありました。
〓〓〓 Componentタグを複数使用している場合 〓〓〓
「Component」タグを使用したら、「Feature」タブに追加する必要がありました。
追加しないとコンパイルエラーとなりました。
〓〓〓 アンインストール時の問題 〓〓〓
「Component」タグを複数使用している場合には「Guid」が一緒だとアンインストールが正常に行えませんでした。
エクスプローラで見ているとフォルダが存在しているが、クリックするとフォルダが存在しないとエラーがでます。
コピー&ペーストで作成していたので、この問題にひっかかってしまいました。
・コントロールパネルから確認すると削除されていますが、フォルダは残ったままになっていました。