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.

questionAnswers(3)

yourAnswerToTheQuestion