С помощью 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)" ?>
- в 32-битном
- смотрите
$(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?>
это хак, но он работал для моего варианта использования.