Compartilhe que você está se especializando

Há muitos anos fizemos um post sobre Como criar um pacote MSI a partir de um monitoramento do computador (e gerando um pacote MSI que executasse as mesmas alterações monitoradas). Agora vamos mostrar como fazer um pacote MSI customizado, utilizando o WiX 3.14.

Deixaremos um exemplo prático e também disponibizaremos em nosso GitHub. Para simplificar, em nosso exemplo, faremos uma instalação para o perfil do usuário (na pasta appdata, sem precisar de elevação).

Criando um pacote MSI

Instale o WiX 3.14 em seu computador, reinicie, abre o CMD e veja se consegue acessar a pasta C:\Program Files (x86)\WiX Toolset v3.14\bin e executar os comandos candle.exe e light.exe

Gere um ID para sua aplicação, para isso abre o PowerShell e execute o comando (copie o código gerado, será usado mais para frente):

[guid]::NewGuid()

Agora crie a estrutura de pasta (em preto) e arquivos (em azul):

C:\

  └──Temp

       └── MSI

         ├── Arquivos

         ├── bin

         ├── Images

          ├── obj

         ├── Build.cmd

         ├── License.rtf

        └── Product.wxs

Na pasta Arquivos coloque os arquivos que você deseja em seu pacote (indepentende de para onde cada arquivo será colocado).

Na pasta Imagens coloque:

  • Um icone com nome logo.ico ;
  • Uma imagem WixUIBanner.bmp (com resolução 493 de largura x 58 de altura);
  • Uma imagem WixUIDialog.bmp (com resolução 493 de largura x 312 de altura);

No arquivo Build.cmd coloque o seguinte conteúdo:

@echo off
goto inicio

:erro
echo.
echo Erro
goto fim

:inicio

set WIX=C:\Program Files (x86)\WiX Toolset v3.14\bin

if not exist obj mkdir obj
if not exist bin mkdir bin

echo.
echo ======================================
echo Limpando arquivos antigos
echo ======================================
del /Q obj\*.wixobj >nul 2>&1

echo.
echo ======================================
echo Compilando arquivos WiX
echo ======================================
"%WIX%\candle.exe" -ext WixUIExtension *.wxs -out obj\

if errorlevel 1 goto erro

echo.
echo ======================================
echo Gerando MSI
echo ======================================
"%WIX%\light.exe" obj\*.wixobj -ext WixUIExtension -out bin\Pacote.msi

if errorlevel 1 goto erro


echo.
echo MSI criado com sucesso
goto fim


:fim
pause

Já no arquivo Product.wxs coloque :

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product
      Id="*"
      Name="NOME DA SUA EMPRESA"
      Language="1046"
      Version="1.0.0.0"
      Manufacturer="SIGLA DA SUA EMPRESA"
      UpgradeCode="ID GERADO NO POWERSHELL"
	  Codepage="65001">

    <Package
        InstallerVersion="500"
        Compressed="yes"
        InstallScope="perUser" />

	<!-- UI Interface -->

    <WixVariable Id="WixUIBannerBmp" Value="Images\WixUIBanner.bmp" />
    <WixVariable Id="WixUIDialogBmp" Value="Images\WixUIDialog.bmp" />
    <WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
		
    <UI>
		<!-- EXEMPLOS DE UI's
		<UIRef Id="WixUI_Minimal"/>	
		<UIRef Id="WixUI_InstallDir"/>
		<UIRef Id="WixUI_Advanced"/>
		-->
		<UIRef Id="WixUI_Minimal"/>
	</UI>

	<!-- ICON -->
	<Icon Id="PackageIcon" SourceFile="Images\logo.ico" />
	<Property Id="ARPPRODUCTICON" Value="PackageIcon" />

    <MediaTemplate EmbedCab="yes"/>

    <Directory Id="TARGETDIR" Name="SourceDir">
	
		<!-- PARA PODER CRIAR ATALHO NA AREA DE TRABALHO-->
		<Directory Id="DesktopFolder"/>

		<Directory Id="LocalAppDataFolder">

			<Directory Id="INSTALLFOLDER"
					   Name="Seu Aplicativo">
					   
				<Component Id="MainFiles"
					Guid="B7A65A31-4A6D-4E0C-9E7A-222222222222">
					<!-- Um exemplo para copiar arquivo -->
					<File Id="FILEBGINFO" Source="..\Payload\bginfo.bgi" />

					<!-- Um exemplo para copiar arquivo e criar atalho -->
					<File Id="APPBGINFO" Source="..\Payload\bginfo.exe">
						<Shortcut
							Id="DesktopShortcut"
							Directory="DesktopFolder"
							Name="arquivo2"
							Description="arquivo2"
							WorkingDirectory="INSTALLFOLDER"
							Advertise="no"/>

					<!-- Um exemplo para criar a chave principal do produto -->
					<RegistryKey Root="HKCU" Key="Software\Seu Aplicativo>
						<RegistryValue Name="Installed" Type="integer" Value="1" KeyPath="yes"/>
					</RegistryKey>
					
					<!-- Um exemplo para criar a chave um registro -->
					<RegistryKey Root="HKCU" Key="Software\Microsoft\Windows\CurrentVersion\Run">
						<RegistryValue Name="Word" Type="string" Value="winword.exe"/>
					</RegistryKey>
					
					<!-- Limpeza na desinstalação -->
					<RemoveFolder Id="RemoveInstallFolder"
						Directory="INSTALLFOLDER"
						On="uninstall"/>

					<RemoveFile
						Id="RemoveDesktopShortcut"
						Name="arquivo2.lnk"
						Directory="DesktopFolder"
						On="uninstall"/>

				</Component>

			</Directory>

		</Directory>

    </Directory>

    <Feature Id="MainFeature" Title="Seu Aplicativo" Level="1">

      <ComponentRef Id="MainFiles"/>
	  

    </Feature>

	<!-- Criando uma Schedule Task -->
	<CustomAction
		Id="CreateScheduledTask"
		Directory="TARGETDIR"
		Execute="immediate"
		ExeCommand='schtasks.exe /Create /F /TN "NOME DA TAREFA AGENDADA" /SC MINUTE /MO 15 /TR "\"[#ARQUIVO2]\" --file [FILEBGINFO]"'
		Return="check"/>

	<!-- Removendo a Schedule Task quando desinstalar -->
	<CustomAction
		Id="DeleteScheduledTask"
		Directory="TARGETDIR"
		Execute="deferred"
		Impersonate="yes"
		ExeCommand='schtasks.exe /Delete /TN "NOME DA TAREFA AGENDADA" /F'
		Return="ignore"/>

	<InstallExecuteSequence>
		<Custom Action="CreateScheduledTask" After="InstallFiles">NOT Installed</Custom>
		<Custom Action="DeleteScheduledTask" Before="RemoveFiles">REMOVE="ALL"</Custom>
	</InstallExecuteSequence>

  </Product>

</Wix>

Crie no wordpad o arquivo License.rtf com o seguinte conteúdo:

CONTRATO DE DIREITO DE USO

Esse software possui direitos de uso, ao instalar este software voce concorda com os termos abaixo.

Este software e corporativo e o autor nao se responsabiliza por danos decorrentes do uso ou da impossibilidade de uso deste software.

A instalacao e o uso deste software implicam na aceite destes termos.

Caso nao concorde com estes termos, cancele a instalacao.

Agora abra o CMD, execute o comando Build.cmd , se os arquivos estavam na pasta confirme o status de sucesso na criação do MSI e em seguida teste em seu ambiente. Não se esqueça de verificar tudo o que precisa ser ajustado durante o teste desse pacote, antes de colocar em produção.

Como você deve ter percebido, nesse arquivo será o conteúdo necessário para gerar o pacote MSI, deixei alguns exemplos para que lhe facilite alterar conforme sua realidade.

Fontes/Referências

NVLAN – Página de GitHub
NVLAN – Como criar um pacote MSI

https://github.com/wixtoolset/wix3/releases

Mais Informações

Esperamos ter te ajudado e estaremos sempre a disposição para mais informações.

Se você tem interesse em algum assunto específico, tem alguma dúvida, precisa de ajuda, ou quer sugerir um post, entre em contato conosco pelo e-mail equipe@nvlan.com.br.

NVLAN - Consultoria