3

私のWixには、次のように多くのファイルが含まれています。

<Component Id="mycomponent" Guid="*" Feature="Core" >
  <Condition>$(var.Include) = 1</Condition>
  <File Id="mycomponent.file" KeyPath="yes" 
        Source="$(var.BinDir)\mycomponent.file" />
</Component>

したがって、var.Includeの異なる値を渡して、異なる環境用のパッケージを生成できます。

結果のパッケージは機能しているように見えますが、これらのコンポーネントを含まないように設定した場合でも、パッケージのサイズは常に非常に大きいことに気付きました。WiXは常にmsiのビルドにすべてのコンポーネントを含めているように見え、パッケージがvar.Include = 0 ...でビルドされたときにのみ、これらのコンポーネントをインストールしないことを選択しました。

これは正常な動作ですか?

4

3 に答える 3

6

条件要素は、コンポーネントがビルドに含まれるかどうかではなく、コンポーネントがインストールされるかどうかを決定するために使用されます。また、条件ステートメントとプリプロセッサ変数/ステートメントで使用されるWindowsインストーラのプロパティを混同しないように注意してください。2つの異なる獣。

于 2013-03-04T14:41:40.723 に答える
5

7zipなどのファイル圧縮/解凍ソフトウェアを使用してMSI出力ファイルを開き、開いたMSIファイル内のpackage.cabファイルを開くことで確認できます。「mycomponent」のようなIDのファイルがそこに存在するかどうかを確認します。

変数に依存しているので、それが期待されていることを願っています。それは、installコマンド呼び出しからinstallプロパティとして設定することもできます。

更新:プリプロセッサステートメントを使用して、以下のようにWIXを修正できるため、結果のmsiからこれらのオプションのコンポーネントを除外できます。

    <?if $(env.MySku) = Enterprise ?>
       <Component Id="mycomponent" Guid="*" Feature="Core">
          <Condition>$(var.Include) = 1</Condition>
          <File Id="mycomponent.file" KeyPath="yes" Source="$(var.BinDir)\mycomponent.file" />      
       </Component>
    <?endif ?>
于 2013-03-04T12:17:21.990 に答える
3

@RinoTomと@Christopherが指摘しているように、インストール時の選択(条件タグ)はビルド時の選択( ?ifメタタグ)とは大きく異なります。インストール時に選択できるようにするには、含まれているコンポーネントが.msiに含まれている必要があります。このアプローチの利点は、ビルド時だけでなく、インストール時にもダイアログまたはAppSearchを介して、条件を決定するプロパティを設定できることです。

しかし、あなたが求めているのは、ビルド時に選択された特定の条件のセットに合わせて調整された複数のパッケージビルドです。別の方法として、オプションの各コンポーネントを個別のファイルのフラグメントとして定義することもできます。次に、パッケージ構成ごとに、必要なフラグメントのみをコンパイルします。

del /q *.wixobj
candle main_package.wxs
for %%f in (optional_1.wxs optional_5.wxs optional_27.wxs) do candle %%f
light *.wixobj -out tailored_package_A.msi

含めたいフラグメントのみが.wixobjにコンパイルされているため、それらのみが出力パッケージに表示されます。これは、常に存在するコンポーネントがいくつかある場合に特にうまくスケーリングしますが、オプションのコンポーネントはほんの一握りです。

于 2013-03-05T03:15:02.817 に答える