web-dev-qa-db-ja.com

Wixを使用して1つの.wxsファイルから32ビットと64ビットのインストーラーを作成する

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でこれを試しました。

31
KevM

@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属性または要素の値に挿入させることができます。いくつかの例:

32/64ビットコンポーネント

_<Component Id="..." Win64="$(var.Win64)">
   ...
</Component>
_

これにより、Visual Studio WiXエディターで$(var.Win64)が許容属性値(yes/no)ではないという警告が表示されますが、これらは無視しても問題ありません。プリプロセッサーは、コンパイラーがそれを保持するまでに適切な値を置き換えます。

32/64ビットProgram Filesディレクトリ

_<Directory Id="$(var.PlatformProgramFilesFolder)">
  ...
</Directory>
_

個別の32/64ビット製品コードを処理するための更新

32ビットと64ビットのインストーラーでさまざまな製品コード(またはほとんど何でも)の要件を処理する方法を尋ねるrharrison33のコメントへの応答(それらを自動生成することができない/望まない場合):

  • コマンドラインまたは応答ファイルを使用して、プリプロセッサ変数としてキャンドルに個別の製品コードを渡します。
キャンドル<他のすべてのフラグ> -d ProductCode32 = <guid1> -d ProductCode64 = <guid2> 
  • アーキテクチャに依存するプリプロセッサ変数の1つとして製品コードを追加し、適切な入力変数に設定します。
    • 32ビット_<?if ?>_ブランチ:<?define ProductCode = "$(var.ProductCode32)" ?>
    • 64ビット_<?if ?>_ブランチ:<?define ProductCode = "$(var.ProductCode64)" ?>
  • _Product/@Id_の$(var.ProductCode)を参照してください。

ダニエルのリンクが質問に答えて、さらに多くの素晴らしい情報を持っているので、このCWを作りました。

45
shambulator

WiX 3.7でこの問題が発生しました。これは小さなインストーラーであり、変数の柔軟性を必要としなかったため、開始タグと同じ方法でラップすることにより、パーサーから終了ディレクトリタグを隠しました。

<?if $(sys.BUILDARCH)=x64?>
    <Directory Id="ProgramFiles64Folder">
<?else?>
    <Directory Id="ProgramFilesFolder">
<?endif?>

...

<?if $(sys.BUILDARCH)=x64?></Directory><?else?></Directory><?endif?>

これはハックですが、私のユースケースではうまくいきました。

3
tallungulate