Instalador Wix: Configurando a propriedade de condição do componente ao fazer uma instalação administrativa do MSIEXEC na linha de comando
Temos três tipos / tipos de produto, mas apenas um MSI escrito em WiX. Quando construímos o instalador, transmitimos o sabor através de uma constante definida:
Call MSBUILD.bat ..\MSIs\CoreProduct\OurProduct.sln /p:DefineConstants="FLAVOUR=%_Flavour%"
e a constante é configurada no Visual Studio, em Compilar -> Definir variáveis do pré-processador como FLAVOR = 50. O processo de construção passa nos valores 50, 200 ou LITE como o sabor.
No código WiX, temos muitas condições em nossos componentes que informam qual arquivo instalar com base no sabor; por exemplo
<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>
Portanto, o exemplo acima instalará um arquivo chamado "ClientListView Lite.r5m" se o FLAVOR for LITE ou instalará um arquivo chamado "ClientListView 200.r5m" se o FLAVOR for 200.
Tudo isso funciona como esperado e já faz anos!
Mas agora, temos uma versão web do nosso produto e precisamos de um arquivo zip para conter a estrutura de pastas e os arquivos que seriam instalados para cada tipo. Eu descobri que você pode executar um msi na linha de comando usando o MSIEXEC e o argumento / a, que redirecionará tudo o que teria sido instalado em uma pasta e pensei que era exatamente isso que eu queria ... mas, infelizmente, não está funcionando como eu. esperava.
O que parece estar fazendo é executar o MSI e extrair os arquivos na pasta de destino, mas está ignorando o sabor e, portanto, você acaba com os arquivos "ClientListView Lite.r5m" e "ClientListView 200.r5m" extraídos em a pasta; o que obviamente não é o que eu quero.
Ao ler os documentos no MSIEXEC, parece que você pode passar o valor para uma propriedade pública, por exemplo, msiexec.exe / a "C: \ Example.msi" MY_PROP = "myValue" - então achei que isso poderia me ajudar; então no meu código WiX eu adicionei a linha:
<Property Id='PRODTYPE' Value="$(var.FLAVOUR)"/>
e depois alterei as condições dos meus componentes para ficarem assim:
<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>
mas, apesar de compilado, execute-o via:
msiexec /a OurProduct.msi /qb PRODTYPE=200 TARGETDIR="C:\InstalledFiles200"
ainda extrai os dois arquivos para os sabores 200 e LITE, onde eu só queria aquele para 200.
Então, estou tentando fazer algo que não é possível ... ou estou fazendo algo errado - qualquer ajuda seria apreciada com gratidão, porque a alternativa de imitar o processo em um arquivo em lotes para criar meu zip; vai ser horrendo !!
Felicidades,
Chris.