web-dev-qa-db-ja.com

WiXインストーラーがXmlファイルを条件付きで更新するために空のCreateFolderを必要とするのはなぜですか?

TL; DR:この条件付きコンポーネントにempty<CreateFolder/>要素が必要な理由それを機能させるために?

社内アプリケーション用の簡単なWiXベースのインストーラーを作成しています。このインストーラーは、標準構成ファイル(通常の.NET .configファイル)を展開し、コマンドラインでmsiexecに渡されるプロパティを使用してカスタマイズする必要があります。

カスタマイズの1つは、RUNTIMEプロパティが定義されている場合にのみ、特定のアプリケーション設定を作成することです。そのためのWiXコンポーネントを次に示します。

  <Component Id="C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime"
             Guid="*">
    <Condition>
      <![CDATA[RUNTIME]]>
    </Condition>

    <CreateFolder/>

    <util:XmlFile Id="X.Runtime.1"
                  Action="createElement"
                  ElementPath="/configuration/appSettings"
                  File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
                  Name="add"
                  Sequence="2"/>

    <util:XmlFile Id="X.Runtime.2"
                  File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
                  ElementPath="/configuration/appSettings/add[\[]not(@key)[\]]"
                  Action="setValue"
                  Name="key"
                  Value="RunTime"
                  Sequence="3"/>

    <util:XmlFile Id="X.Runtime.3"
                  File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
                  ElementPath="/configuration/appSettings/add[\[]@key='RunTime'[\]]"
                  Action="setValue"
                  Name="value"
                  Value="[RUNTIME]"
                  Sequence="4"/>

  </Component>

これは期待どおりに機能します。msiexecのコマンドラインでRUNTIMEを指定すると、新しい要素が作成されます。そうでなければ、何も起こりません。

このコンポーネント内に<CreateFolder/>を空にする必要があるのはなぜですか?

これを機能させようとしたところ、「 Wix条件ステートメント 」が見つかりました。これは、機能するコンポーネントを示していますが、<CreateFolder/>が必要な理由を説明していません。

<CreateFolder/>を削除すると、次のエラーが発生します。

ICE18:コンポーネントのキーパス: 'C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime'はディレクトリ: 'INSTALLDIR'です。ディレクトリ/コンポーネントのペアは、CreateFoldersテーブルにリストされている必要があります。

これが何を意味するかを知っていれば、きっとかなり有益です。

44
Bevan

すべてのコンポーネントにはキーパスがあります。最も一般的なのはファイルです。コンポーネントにはファイルやその他のキーパスがないため、WiXはデフォルトのディレクトリを提供します。次にWindowsインストーラーが表示され、ディレクトリキーパスを持つコンポーネントは、他の方法で作成する場合でも、ディレクトリが作成されることを確認する必要があると言います。それは簡単な修正で愚かなルールです。

44
Bob Arnson

代わりに、コンポーネントタグでパラメーターKeyPath = "yes"を使用できます。 「INSTALLDIR」がこのコンポーネントの正しいパスである場合のみ。

19
Kim BG