С помощью Wix, чтобы создать 32bit и 64bit установщиков из одной.файл wxs

Я хотел бы сохранить свой верхний уровень .wxs сухое, дом 32 и 64 битных инсталляторов. Я использую аргумент-arch для свечи.exe для управления архитектурой установщика по умолчанию.

стены я жму сейчас это кажется Папка_programfiles отличается между 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.

2 ответов


, а не условно включая открытие Directory elements (что делает недействительным XML), условно заданные переменные препроцессора, которые используются в качестве имен каталогов, как ссылается комментарий @Daniel Pratt. Аналогично, наличие переменной" да/нет", обусловленной платформой, упрощает настройку 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.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 бит каталог программных файлов

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

обновление для обработки отдельных 32/64-битных кодов продуктов

в ответ на комментарий rharrison33, спрашивающий, как обращаться с требованием различные коды продуктов (или почти все) в установщиках 32 и 64 бит (предполагая, что вы не можете / не хотите автоматически генерировать их):

  • передайте отдельные коды продуктов в candle в качестве переменных препроцессора в командной строке или с помощью файла ответов:
candle <all other flags> -d ProductCode32=<guid1> -d ProductCode64=<guid2>
  • добавьте код продукта в качестве одной из переменных препроцессора, зависящих от архитектуры, и задайте для нее соответствующую входную переменную:
    • в 32-битном <?if ?> бранч:<?define ProductCode = "$(var.ProductCode32)" ?>
    • в 64-битном <?if ?> отрасли: <?define ProductCode = "$(var.ProductCode64)" ?>
  • смотрите $(var.ProductCode) на Product/@Id.

сделал это CW, потому что ссылка Даниэля отвечает на вопрос и имеет гораздо больше отличной информации.


у меня была эта проблема с WiX 3.7. Это был крошечный установщик, и мне не нужна гибкость переменных, поэтому я спрятал закрывающий тег каталога от парсера, обернув его так же, как открывающий тег:

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

...

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

это хак, но он работал для моего варианта использования.