Criar Instaladores com o Wix (Parte 2)

Este é mais um post da série que mostra como Criar Instaladores com o Wix, em que a primeira parte pode ser vista aqui. Neste post pretendo mostrar como melhorar o instalador que a gente criou no post anterior. Até agora temos um *.wxs que não faz nada e nem instala nada. Para melhora isto temos que adicionar algumas funcionalidades.

Melhorando o Instalador

Na versão que temos até agora só temos o esqueleto do instalador. Temos de adicionar informações sobre os recursos que desejamos instalar. Em http://wix.sourceforge.net/manual-wix3/votive_project_references.htm temos uma lista das referências mais comuns utilizadas em projetos no Visual Studio. Para este exemplo vamos utilizar a variável $(var.MyProjectName.TargetPath) indicando o nome do projeto ao qual vamos gerar o executável. Para funcionar você também deverá adicionar o projeto como referência no Wix. Para isso clique com o direito no projeto e em Add References…, escolha Projects e localize o projeto.

Para isso descomente as linhas com a tag Component

<!-- <Component Id="ProductComponent"> -->

e adicione o código, lembrando de substituir pelo nome de seu projeto o WindowsFormsApplication2TesteInstaller:

<File Source="$(var.WindowsFormsApplication2TesteInstaller.TargetPath)" DiskId="1" />

Após isso pode gerar o build novamente que o projeto já aparecerá após a compilação os arquivos:

Arquivos gerados

Arquivos gerados

O arquivo SetupProjectWix.wixpdb é um arquivo gerado como resultado que não precisa ir para o cliente, ele tem outras funcionalidades. Os outros dois são necessários de serem colocados na distribuição. Esse instalador funciona, porém não gera nenhuma tela. Este será o assunto do próximo tópico.

Interface Padrão

O Wix XML permite configurar algumas interfaces padrão, e tem recursos para GUI personalizadas também, como configuração de alguma variável que o programa precisará definir de acordo com a preferência do usuário na instalação. Para isso você deverá adicionar uma referência no projeto para a WixUIExtension.dll que está no diretório de instalação do Wix, e no arquivo *.wxs adicionar dentro da tag products.

<UIRef Id="WixUI_Mondo"/>
<UIRef Id="WixUI_ErrorProgressText" />

Existem algumas interfaces disponíveis no Wix:

  • WixUI_Minimal – Somente a tela de instalação
  • WixUi_InstallDir – Permite escolher o diretório de instalação
  • WixUI_FeatureTree – Permite escolher as opções (recursos) a serem instalados
  • WixUI_Mondo – Instalação completa – todos os recursos anteriores.
  • É interessante você testar os recursos para ver quais se adequam as necessidades.

    Configurando Licença

    A licença é controlada pela variável WixUILicenseRtf que deverá ter o valor do RTF da licença. Alguns autores recomendam, para fins evitar problemas de compatibilidade, que o arquivo seja feito com o WordPad

    <WixVariable Id="WixUILicenseRtf" Value="F:\DocLicenca.rtf" />
    

    Recursos

    Os recursos instalados são mostrados na tela abaixo:

    escolha de recursos

    Para habilitar a escolha do local você tem que colocar o atributo ConfigurableDirectory na Tag Feature principal do projeto:

    <Feature Id="ProductFeature" Title="SetupProjectWix" Level="1" ConfigurableDirectory="INSTALLFOLDER">
    	<ComponentGroupRef Id="ProductComponents" />
    </Feature>
    

    Para configurar outras opções você deve criar novos componentes. Cada componente deve corresponder a um conjunto de funcionalidades. Veja abaixo o exemplo dos componentes:

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
          <Component Id="MainExecutable">
           <File Source="$(var.WindowsFormsApplication2TesteInstaller.TargetPath)" DiskId="1"/>
          </Component>
          <Component Id="ComponentRegistry">
            <File Source="file.txt" DiskId="1"/>
          </Component>
          <Component Id="ComponentArquivo">
            <File Source="file2.txt" DiskId="1"/>
          </Component>
        </ComponentGroup>
      </Fragment>
    

    Também é necessário definir novas Features, lembrando que o nível(atributo Level) das mesmas terá impacto no que aparecerá nas opções:

    <Feature Id="ProductFeature" Title="SetupProjectWix" Level="2" ConfigurableDirectory="INSTALLFOLDER">
          <ComponentGroupRef Id="ProductComponents" />
        </Feature>
        <Feature Id="SubFeatureRegistry" Title="Registro" Level="5" ConfigurableDirectory="INSTALLFOLDER">
          <ComponentGroupRef Id="ProductComponents" />
        </Feature>
        <Feature Id="SubFeatureFile" Title="File" Level="4" ConfigurableDirectory="INSTALLFOLDER">
          <ComponentGroupRef Id="ProductComponents" />
        </Feature>
    

    Na instalação padrão o level inicial é 1, quando você escolhe Tipical ele e configurado para 3 e quando você escolhe completa ele é configurado para 1000. Então selecionando Tipical tudo que tiver level menor ou igual a 3 será instalado e o que tiver level maior do que 3 não será instalado. Veja a Figura abaixo

    Nivel de componentes

    No próximo post mostro como customizar as telas do instalador.

    Criar Instaladores com o Wix (Parte 1)

    Introdução

    Depois de meses de trabalho e muita dedicação, com várias etapas, aprendizado e desafios. Você compila o projeto, coloca em uma pasta no pen-drive e entrega para o cliente, explicando os vários arquivos que devem ser modificados, o que deve ser instalado para o software funcionar, as chaves no registro a serem alteradas. Essa forma de entrega ficou um pouco defasada, um trabalho tão bonito não pode ser entregue dessa forma. Assim para dar um toque profissional você deve criar um instalador que simplifica as etapas de implantação e evita diversas dores de cabeça. A partir do Visual Studio 2012 o instalador padrão, que era desenvolvido junto com a ferramenta, não é mais disponibilizado. Agora somente existe uma versão gratuita do InstallShield que para utilizá-la você deve entrar no site da empresa e se cadastrar. Porém o foco desse material é criar instaladores com o Wix, um instalador openSource baseado em xml que é muito poderoso. Porém para poder explorá-lo você terá de colocar um pouco a mão na massa.

    Wix Installer

    Wix

    Para instalar o WIX você deverá acessar a página do produto através deste link na página do CodePlex. Lá você encontra o binário do Wix na última versão, código fonte do produto e acesso a documentação padrão do mesmo. No momento em que este texto foi escrito estava disponível a versão 3.8 do instalador. Localize o último release e realize o download.

    Após a instalação você perceberá no Visual Studio uma nova guia na hora que você for adicionar os projetos com o nome “Windows Installer Xml” que pode ser visto abaixo

    Visual Studio

    Abrindo o arquivo WXS

    Para a criação do instalador com a Ferramenta você precisa definir um *.wxs que contém a configuração de como funciona o comportamento do Wix,

    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
         xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
         xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" >
      <Product Id="*" Name="SetupTeste" Language="1033" Version="1.0.0.0" Manufacturer="LEalpjm" UpgradeCode="55f8e4e7-6f95-4b4c-a9ee-5b4005d70175">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
    
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate />
    
        <Feature Id="ProductFeature" Title="SetupTeste" Level="1">
          <ComponentGroupRef Id="ProductComponents" />
        </Feature>
    
        <Binary Id="CustomAction1.CA.dll"
               src="$(var.CustomAction1.TargetDir)CustomAction1.CA.dll" />
    
        <InstallExecuteSequence>
          <Custom Action="AssignConfigFile" After="CostFinalize" />
          <Custom Action="EnableSession" Before="ConfigurAppConfig" />
          <Custom Action="ConfigurAppConfig" After="InstallFiles"></Custom>
        </InstallExecuteSequence>
    
      </Product>
    

    Entre os locais onde se encontra bom material de referência sobre a ferramente estão os endereços:

  • http://wixtoolset.org/documentation/manual/v3/
  • http://wix.tramontana.co.hu/tutorial
  • Nestes locais temos ótimo material de referência e ambos me ajudaram em muitas das dúvidas relacionadas a criação de projetos com o Wix.
    Uma observação importante é que apesar de o Wix estar sobre uma licença Microsoft Reciprocal License (MS-RL) os instaladores criados a partir da ferramenta podem ter licenças proprietárias, a MS-RL aplica-se somente a trabalhos derivados no desenvolvimento do próprio Wix.

    Para a utilização do Wix como ferramenta de instalação sugiro configurar o Path do Windows para que seja possível utilizar a linha de comando de forma prática. Um bom tutorial de como configurar o path do Windows pode ser visto aqui. (link para título 2).
    Após a instalação do Wix e a configuração do path, vamos entender como a ferramenta funciona. Se você precisa entender como configuara o path, veja este link.

    Wix Components

    O Wix é composto por alguns executáveis que podem ser encontrados na pasta de instalação, aqui segue a descrição dos principais

  • Candle.exe – Transforma o fonte Wix (*.wxs) em um arquivo intermediário *.wixobj
  • Light.exe – Transforma o arquivo intermediário (*.wixobj) em um instalador
  • Dark.exe –Convert um MSI em apropriados WXS files
  • Lit.exe –Gera bibliotecas que podem ser utilizadas em outros projetos
  • Para a criação de um instalador devemos escrever os arquivos WXS que é um xml com formatação própria, e de posse dele gerar o arquivo WIXOBJ através do candle.exe, e utilizar o light.exe para gerar o MSI a partir do WIXOBJ gerado na etapa anterior.

    GUID

    Também é importante falar sobre as GUIDs agora, se você ainda não conhece as GUID são identificadores únicos que permitem ao Windows reconhecer seu programa de forma única. Para o Windows Installer isso é importante, uma vez que através dele e possível reconhecer sua aplicação e saber que ela não é qualquer outra, para isso o GUID deve ser único.

    O Guid é um número hexadecimal longo com este formato:

    CE26AD1E-30D5-4E03-8CBE-6DF5C23AA833
    

    Para gerar GUIDs existem vários utilitários, se você pode utilizar o padrão do Visual Studio no menu Tools > Create GUID.
    Você precisará de pelo menos 3 GUIDs no seu projeto, um para o produto (atributo Id da Tag produto>, um para o atributo UpgrateCode e um para cada Package que você criar no projeto. Os GUID do Produto e o do UpgradeCode não devem ser modificados, são através deles que o Windows identificará seu produto e as atualizações do mesmo. Porém os GUIDs dos packages são únicos, e uma forma interessante de garantir isso é deixando um * (asterisco) no lugar do GUID, pois assim a cada compilação será gerado um GUID único.

    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    	<Product Id="*" Name="SetupProjectWix" Language="1033" Version="1.0.0.0" Manufacturer="" UpgradeCode="{7E237DD6-9B52-47E2-B9BB-2672FF0712FF}">
    	<Package Id="*" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
     
    	<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    		<MediaTemplate />
     
    		<Feature Id="ProductFeature" Title="SetupProjectWix" Level="1">
    			<ComponentGroupRef Id="ProductComponents" />
    		</Feature>
    	</Product>
     
    	<Fragment>
    		<Directory Id="TARGETDIR" Name="SourceDir">
    			<Directory Id="ProgramFilesFolder">
    				<Directory Id="INSTALLFOLDER" Name="SetupProjectWix" />
    			</Directory>
    		</Directory>
    	</Fragment>
     
    	<Fragment>
    		<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
    			<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
    			<!-- <Component Id="ProductComponent"> -->
    				<!-- TODO: Insert files, registry keys, and other resources here. -->
    			<!-- </Component> -->
    		</ComponentGroup>
    	</Fragment>
    </Wix>
    

    Agora podemos compilar a primeira versão do instalador. Para compilar esse projeto é da mesma forma que fazemos com qualquer instalador Windows, basta realizar um build que o resultado gerado na pasta bin/Debug ou bin/Release será o arquivo *.msi de instalação. Esse é um instalador simples, na verdade tão simples que não instala nada.

    No próximo post vou falar sobre como melhorar este instalador

    Referências:

  • http://msdn.microsoft.com/en-us/magazine/cc163456.aspx
  • http://wix.tramontana.co.hu/tutorial