tutorial - wix toolset visual studio
Uso de Wix para crear instaladores de 32 bits y 64 bits a partir de un archivo.wxs (2)
Me gustaría mantener mi nivel superior .wxs DRY mientras construyo instaladores de 32 y 64 bits. Estoy usando el argumento -arch para candle.exe para controlar qué arquitectura predeterminada del instalador se está construyendo.
El muro que estoy golpeando en este momento es que parece que ProgramFilesFolder es diferente entre las arquitecturas de 32 y 64 bits (ProgramFiles64Folder). Aquí está mi primer intento de evitar:
<?if $(sys.BUILDARCH)=x64 ?>
<Directory Id=''ProgramFiles64Folder'' Name=''PFiles''>
<?else ?>
<Directory Id=''ProgramFilesFolder'' Name=''PFiles''>
<?endif ?>
<Directory Id=''the-rest'' Name="Company Name">
...
Intenté esto con un error. Aparentemente, la validación de XML se activa antes de que se evalúe el preprocesador. Cuando cambio manualmente para usar ProgramFiles64Folder, mi compilación funciona.
Intenté ir por la ruta de DirectoryRef sin éxito. ¿Alguna sugerencia sobre cómo hacer que esto funcione sin hacer un reemplazo de sed en el archivo .wxs?
Nota: Probé esto en Wix 3.5 y 3.6.
En lugar de incluir condicionalmente los elementos de Directory
apertura (que invalida el XML), establezca condicionalmente las variables del preprocesador que se utilizan como nombres de directorio, como se refiere el comentario de @Daniel Pratt. De manera similar, tener una variable "sí / no" condicionada en la plataforma facilita la configuración de componentes de 64 bits, búsquedas en el registro, etc.
Definiendo las variables
(De esta respuesta )
<?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)
está incorporado, pero su valor se utiliza para definir las variables personalizadas $(var.ProductName)
, $(var.Win64)
y $(var.PlatformProgramFilesFolder)
.
Usando las variables
Puede usar las directivas preprocesador <?if
If para probar los valores de las variables (como se hace con $(var.Platform)
al definir las variables personalizadas más arriba) o hacer que el preprocesador inserte los valores de las variables en el atributo XML o los valores de los elementos. Un par de ejemplos:
Componentes de 32/64 bits.
<Component Id="..." Win64="$(var.Win64)">
...
</Component>
Esto producirá advertencias en el editor de Visual Studio WiX de que $(var.Win64)
no es uno de los valores de atributo permitidos ( yes
/ no
), pero se pueden ignorar de forma segura, ya que el preprocesador habrá sustituido un valor apropiado por el momento compilador se apodera de ello.
Directorio de archivos de programa de 32/64 bit
<Directory Id="$(var.PlatformProgramFilesFolder)">
...
</Directory>
Actualización para manejar códigos de producto de 32/64 bits separados
En respuesta al comentario de rharrison33, pregunte cómo manejar el requisito de diferentes códigos de producto (o casi cualquier cosa) en los instaladores de 32 y 64 bits (asumiendo que no puede / no quiere generarlos automáticamente):
- Pase códigos de productos separados a vela como variables de preprocesador, en la línea de comandos o utilizando un archivo de respuesta:
candle <all other flags> -d ProductCode32=<guid1> -d ProductCode64=<guid2>
- Agregue un código de producto como una de sus variables de preprocesador dependientes de la arquitectura y configúrelo en la variable de entrada apropiada:
- En la rama de 32 bits
<?if ?>
<?define ProductCode = "$(var.ProductCode32)" ?>
<?if ?>
:<?define ProductCode = "$(var.ProductCode32)" ?>
- En la rama
<?define ProductCode = "$(var.ProductCode64)" ?>
<?if ?>
De 64 bits:<?define ProductCode = "$(var.ProductCode64)" ?>
- En la rama de 32 bits
- Consulte
$(var.ProductCode)
enProduct/@Id
.
Hizo este CW porque el enlace de Daniel responde la pregunta y además tiene mucha más información excelente.
Tuve este problema con WiX 3.7. Era un instalador pequeño y no necesitaba la flexibilidad de las variables, así que oculté la etiqueta de Directorio de cierre del analizador, envolviéndola de la misma manera que la etiqueta de apertura:
<?if $(sys.BUILDARCH)=x64?>
<Directory Id="ProgramFiles64Folder">
<?else?>
<Directory Id="ProgramFilesFolder">
<?endif?>
...
<?if $(sys.BUILDARCH)=x64?></Directory><?else?></Directory><?endif?>
Es un hack, pero funcionó para mi caso de uso.