Я хотел бы сохранить свой верхний уровень .wxs DRY при сборке 32- и 64-разрядных установщиков. Я использую аргумент -arch для Candle.exe, чтобы контролировать, какая архитектура установщика по умолчанию создается.
Стена, о которой я сейчас сталкиваюсь, заключается в том, что похоже, что 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. Есть ли предложения, как заставить это работать без замены sed в файле .wxs?
Примечание: я пробовал это в Wix 3.5 и 3.6.
У меня была эта проблема с WiX 3.7. Это был крошечный установщик, и мне не требовалась гибкость переменных, поэтому я скрыл закрывающий тег Directory от анализатора, обернув его так же, как открывающий тег:
<?if $(sys.BUILDARCH)=x64?>
<Directory Id="ProgramFiles64Folder">
<?else?>
<Directory Id="ProgramFilesFolder">
<?endif?>
...
<?if $(sys.BUILDARCH)=x64?></Directory><?else?></Directory><?endif?>
Это взлом, но это сработало для моего варианта использования.