Instalador de Wix: configuración de la propiedad de condición del componente al realizar una instalación de administrador MSIEXEC en la línea de comandos
Tenemos tres tipos / sabores de nuestro producto, pero solo un MSI escrito en WiX. Cuando construimos el instalador, pasamos el sabor a través de una constante definida:
Call MSBUILD.bat ..\MSIs\CoreProduct\OurProduct.sln /p:DefineConstants="FLAVOUR=%_Flavour%"
y la constante se configura en Visual Studio, en Build -> Definir variables de preprocesador como FLAVOR = 50. El proceso de construcción, pasa en valores 50, 200 o LITE como el sabor.
En el código WiX tenemos un montón de condiciones en nuestros componentes que le indican qué archivo instalar en función del sabor; p.ej
<Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*">
<File Id="fil238A776D9294E14671E012472F9F7196"
KeyPath="yes"
Source="$(var.MenusPath)\ClientListView 200.r5m"
<Condition>$(var.FLAVOUR)=200</Condition>
</Component>
<Component Id="cmp8BFF42B232724DC4BA5B8F87994DEF21" Guid="*">
<File Id="fil808D6428D67248DDB8CA65DBC5978283"
KeyPath="yes"
Source="$(var.MenusPath)\ClientListView Lite.r5m"
<Condition>$(var.FLAVOUR)=LITE</Condition>
</Component>
Entonces, el ejemplo anterior instalará un archivo llamado "ClientListView Lite.r5m" si el FLAVOR es LITE o instalará un archivo llamado "ClientListView 200.r5m" si el FLAVOR es 200.
¡Todo esto funciona como se esperaba y lo ha hecho durante años!
Pero ahora, tenemos una versión web de nuestro producto y necesitamos un archivo zip que contenga la estructura de carpetas y los archivos que se instalarían para cada versión. Descubrí que puedes ejecutar un msi en la línea de comando usando MSIEXEC y el argumento / a que luego redirigirá todo lo que se habría instalado en una carpeta y pensé que esto es exactamente lo que quiero ... pero, por desgracia, no funciona como yo Había esperado.
Lo que parece estar haciendo es ejecutar el MSI y extraer los archivos en la carpeta de destino, pero está ignorando el sabor y, por lo tanto, terminas con los archivos "ClientListView Lite.r5m" y "ClientListView 200.r5m" extraídos en la carpeta; que obviamente no es lo que quiero.
Al leer los documentos en MSIEXEC, parece que puede pasar el valor de una propiedad pública, por ejemplo msiexec.exe / a "C: \ Example.msi" MY_PROP = "myValue", por lo que pensé que esto podría ayudarme; así que en mi código WiX agregué la línea:
<Property Id='PRODTYPE' Value="$(var.FLAVOUR)"/>
y luego alteré las condiciones de mi componente para que sea así:
<Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*">
<File Id="fil238A776D9294E14671E012472F9F7196"
KeyPath="yes"
Source="$(var.MenusPath)\ClientListView 200.r5m"
<Condition><![CDATA[PRODTYPE=200]]></Condition>
</Component>
<Component Id="cmp8BFF42B232724DC4BA5B8F87994DEF21" Guid="*">
<File Id="fil808D6428D67248DDB8CA65DBC5978283"
KeyPath="yes"
Source="$(var.MenusPath)\ClientListView Lite.r5m"
<Condition><![CDATA[PRODTYPE=LITE]]></Condition>
</Component>
pero aunque eso compiló bien, ejecutándolo a través de:
msiexec /a OurProduct.msi /qb PRODTYPE=200 TARGETDIR="C:\InstalledFiles200"
todavía extrae ambos archivos para los sabores 200 y LITE, donde solo quería el de 200.
Entonces, estoy tratando de hacer algo que no es posible ... o estoy haciendo algo mal, agradecería cualquier ayuda, porque la alternativa de imitar el proceso en un archivo por lotes para crear mi zip; será horrible !!
Salud,
Chris