最初のプロジェクトは、インストーラーのすべての指示が記述された単一のファイルで構成されていました。 1つのファイルがインストールされました(計算機)。 次に、たとえば10、20、または100個のファイルを含む、より深刻なプロジェクトを想像してください。 プロジェクトファイルにこれらのファイルの説明を含めると、後で何かを変更する必要が生じたときに、このヒープで特定の何かを検索することは非常に難しいことがわかります。
前のプロジェクトを基礎として、プロジェクトファイルProduct.wxsの外部にインストールされたファイルの説明を取り出します。 これを行うには、 Files.wxsファイルをプロジェクトに追加し、次のコンテンツを定義します。
<? xml version ="1.0" ? >
< Wix xmlns ="http://schemas.microsoft.com/wix/2006/wi" >
< Fragment >
< DirectoryRef Id ="INSTALLLOCATION" >
< Component Id ="ProductComponent" Guid ="b11556a2-e066-4393-af5c-9c9210187eb2" >
< File Id ='Calc' DiskId ='1' Source ='C:\WINDOWS\system32\calc.exe' />
</ Component >
</ DirectoryRef >
</ Fragment >
</ Wix >
* This source code was highlighted with Source Code Highlighter .
プロジェクトのビルドプロセス中にエラーメッセージが表示されないように、 Product.wxsファイルからコンポーネントの説明を削除します。
だった
< Directory Id ="INSTALLLOCATION" Name ="$(var.ProductName)" >
< Component Id ="ProductComponent" Guid ="b11556a2-e066-4393-af5c-9c9210187eb2" >
< File Id ='Calc' DiskId ='1' Source ='C:\WINDOWS\system32\calc.exe' />
</ Component >
</ Directory >
* This source code was highlighted with Source Code Highlighter .
になっています
< Directory Id ="INSTALLLOCATION" Name ="$(var.ProductName)" />
* This source code was highlighted with Source Code Highlighter .
2つの新しいキー< Fragment >および< DirectoryRef >がコードに登場しました。
< Fragment >には、アセンブリ中にプロジェクトに含まれるコードの一部が含まれます。
< DirectoryRef >ディレクトリセクションへのリンク。 たとえば、キー< Directory >以外のコンポーネントの説明を取得できます。
ちなみに、 < * Ref >のようなキーは、プロジェクトをフラグメントに分割するプロセスを簡素化し、コードを整理するのに役立ちます。 < DirectoryRef >に加えて、 < FeatureRef > 、 < ComponentRef >などのリンクがあります。
プロジェクトを少し複雑にするために、メモ帳のインストールを追加します。 コードを次のように変更します。
< DirectoryRef Id ="INSTALLLOCATION" >
< Component Id ="ProductComponent" Guid ="b11556a2-e066-4393-af5c-9c9210187eb2" >
< File Id ='Calc' DiskId ='1' Source ='C:\WINDOWS\system32\calc.exe' />
< File Id ='Notepad' DiskId ='1' Source ='C:\WINDOWS\system32\notepad.exe' />
</ Component >
</ DirectoryRef >
* This source code was highlighted with Source Code Highlighter .
追加されました。 恥ずかしいことは何ですか? 各ファイルへのパス。 ファイルが移行されたらどうなりますか? しかし、それらが100個ある場合はどうでしょうか? 代替品で検索すると役立ちますが、これは私たちの方法ではありません。 新しいキーパラメータ< DirectoryRef > -FileSourceについて知ります。 このパラメーターを使用すると、ベースパスを設定できます。 新しい知識で書き換えると同時に、 DiskId = '1'をコンポーネント定義に追加します。 すべての子要素が同じ値を使用する場合、毎回表示する必要があるのはなぜですか?
< DirectoryRef Id ="INSTALLLOCATION" FileSource ="C:\WINDOWS\system32\" >
< Component Id ="ProductComponent" Guid ="b11556a2-e066-4393-af5c-9c9210187eb2" DiskId ='1' >
< File Id ='Calc' Name ='calc.exe' />
< File Id ='Notepad' Name ='notepad.exe' />
</ Component >
</ DirectoryRef >
* This source code was highlighted with Source Code Highlighter .
< File >キーのSourceパラメーターがNameに変更されていることに注意してください。 つまり ファイルの絶対パスではなく、指定されたディレクトリ内のファイル名で検索するように指示しました。 これが行われない場合、「指定されたファイルが見つかりません」というエラーメッセージが表示されます。
メモ帳を追加し、ショートカットを追加します。 電卓のショートカットが作成され、おandが表示されます。 ショートカットを作成するためのコンポーネントは、ディレクトリ内に記述されています。 別のファイルにショートカットを作成してください。 これを行うには、 Shortcuts.wxsファイルをプロジェクトに追加します。
<? xml version ="1.0" encoding ="UTF-8" ? >
< Wix xmlns ="http://schemas.microsoft.com/wix/2006/wi" >
< Fragment >
< DirectoryRef Id ="ApplicationProgramsFolder" >
< Component Id ="ApplicationShortcutCalc" Guid ="4CEBD68F-E933-47f9-B02C-A4FC69FDB551" >
< Shortcut Id ="ShortcutCalc"
Name ="Calc"
Description ="$(var.ProductName)"
Target ="[INSTALLLOCATION]Calc.exe"
WorkingDirectory ="INSTALLLOCATION" />
< Shortcut Id ="ShortcutNotepad"
Name ="Notepad"
Description ="$(var.ProductName)"
Target ="[INSTALLLOCATION]Notepad.exe"
WorkingDirectory ="INSTALLLOCATION" />
< RemoveFolder Id ="ApplicationProgramsFolder" On ="uninstall" />
< RegistryValue Root ="HKCU" Key ="Software\$(var.Manufacturer)\$(var.ProductName)" Name ="installed" Type ="integer" Value ="1" KeyPath ="yes" />
</ Component >
</ DirectoryRef >
</ Fragment >
</ Wix >
* This source code was highlighted with Source Code Highlighter .
ここでプロジェクトをビルドしようとすると、エラーメッセージが表示されます。 未定義のプリプロセッサ変数 '$(var.ProductName)'
そうです、 Shortcuts.wxsファイルを処理するとき、 Product.wxsファイルで宣言された変数については何もわかりません。 どうする
フラグメントに加えて、WiXではインクルードファイル(インクルード)を使用できます。 このようなファイルの内容は、次のように定義できます。
<? xml version ="1.0" encoding ="utf-8" ? >
< Include >
<!-- -->
</ Include >
* This source code was highlighted with Source Code Highlighter .
フラグメントとは異なり、includeは、自分でファイルに含めるまでアセンブリに自動的に含まれません。 包含が何であるかを理解するために、 Product.wxsファイルの変数の定義を別のファイルに入れましょう。 これを行うには、新しいVariables.wxiファイルをプロジェクトに追加し、変数宣言をそこに転送します。
<? xml version ="1.0" encoding ="utf-8" ? >
< Include >
<? define ProductName ="SetupProject2" ? >
<? define ProductVersion ="1.0.0.0" ? >
<? define ProductCode ="b7bc7c6f-9a4e-4973-be84-eca8e3427c97" ? >
<? define UpgradeCode ="06a81104-1e30-463d-87e1-e8a79b4c682a" ? >
<? define Manufacturer ="MyCompany" ? >
</ Include >
* This source code was highlighted with Source Code Highlighter .
また、 Product.wxsファイルの変数の定義は次のように置き換えられます。
<? include Variables . wxi ? >
* This source code was highlighted with Source Code Highlighter .
また、 Shortcuts.wxsファイルに同じ行を追加することを忘れないでください。 その後、インストールパッケージはエラーなしでコンパイルされます。
1つのファイルProduct.wxsが4つのファイルになりました。 単純なインストールパッケージの場合、特にこのパッケージが一度に記述されている場合は、おそらくこの断片化は意味がありません。 多数のファイルのインストール、ショートカットの作成など、大規模なプロジェクトでは、分離が不可欠です。 そうでなければ、そのようなプロジェクトでは、,にあるように、悪魔は彼の足を折るでしょう。 フラグメントを使用するもう1つの利点は、既製のコードを再利用できることです。
次回、インストールするコンポーネントを選択する機能をパッケージに追加し、ユーザーがインストールオプションを変更できる「自家製」ウィンドウを追加します。
Visual Studioのソースとプロジェクトはここからダウンロードできます