32ビットと64ビットのインストーラーのビルド中、最上位の.wxs DRYを保持したいと思います。candle.exeに-Arch引数を使用して、ビルドするデフォルトのインストーラーアーキテクチャを制御しています。
私が今当たっている壁は、ProgramFilesFolderが32ビットと64ビット(ProgramFiles64Folder)アーキテクチャで異なるように見えることです。これが私の最初の回避策です。
<?if $(sys.BUILDARCH)=x64 ?>
<Directory Id='ProgramFiles64Folder' Name='PFiles'>
<?else ?>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<?endif ?>
<Directory Id='the-rest' Name="Company Name">
...
エラーでこれを試しました。どうやら、XML検証はプリプロセッサが評価される前に発生します。 ProgramFiles64Folderを使用するように手動で変更すると、ビルドが機能します。
DirectoryRefルートを下がろうとしましたが、成功しませんでした。 .wxsファイル内でsed置換を行わずにこれを機能させるための提案はありますか?
注:Wix 3.5および3.6でこれを試しました。
@Daniel Prattのコメントが参照するように、開始Directory
要素を条件付きで含める(XMLを無効にする)のではなく、ディレクトリ名として使用されるプリプロセッサ変数を条件付きで設定します。同様に、プラットフォームで「yes/no」変数を条件にすると、64ビットコンポーネント、レジストリ検索などを簡単に設定できます。
(から この答え )
_<?if $(var.Platform) = x64 ?>
<?define ProductName = "Product Name (64 bit)" ?>
<?define Win64 = "yes" ?>
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else ?>
<?define ProductName = "Product Name" ?>
<?define Win64 = "no" ?>
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>
_
$(var.Platform)
は組み込みですが、その値はカスタム変数$(var.ProductName)
、$(var.Win64)
および$(var.PlatformProgramFilesFolder)
を定義するために使用されます。
プリプロセッサ_<?if
_ディレクティブを使用して変数の値をテストするか(上記のカスタム変数を定義するときに$(var.Platform)
で行うように)、プリプロセッサに変数の値をXML属性または要素の値に挿入させることができます。いくつかの例:
_<Component Id="..." Win64="$(var.Win64)">
...
</Component>
_
これにより、Visual Studio WiXエディターで$(var.Win64)
が許容属性値(yes
/no
)ではないという警告が表示されますが、これらは無視しても問題ありません。プリプロセッサーは、コンパイラーがそれを保持するまでに適切な値を置き換えます。
_<Directory Id="$(var.PlatformProgramFilesFolder)">
...
</Directory>
_
32ビットと64ビットのインストーラーでさまざまな製品コード(またはほとんど何でも)の要件を処理する方法を尋ねるrharrison33のコメントへの応答(それらを自動生成することができない/望まない場合):
キャンドル<他のすべてのフラグ> -d ProductCode32 = <guid1> -d ProductCode64 = <guid2>
<?if ?>
_ブランチ:<?define ProductCode = "$(var.ProductCode32)" ?>
<?if ?>
_ブランチ:<?define ProductCode = "$(var.ProductCode64)" ?>
Product/@Id
_の$(var.ProductCode)
を参照してください。ダニエルのリンクが質問に答えて、さらに多くの素晴らしい情報を持っているので、このCWを作りました。
WiX 3.7でこの問題が発生しました。これは小さなインストーラーであり、変数の柔軟性を必要としなかったため、開始タグと同じ方法でラップすることにより、パーサーから終了ディレクトリタグを隠しました。
<?if $(sys.BUILDARCH)=x64?>
<Directory Id="ProgramFiles64Folder">
<?else?>
<Directory Id="ProgramFilesFolder">
<?endif?>
...
<?if $(sys.BUILDARCH)=x64?></Directory><?else?></Directory><?endif?>
これはハックですが、私のユースケースではうまくいきました。