Passing build parameters to .wxs file to dynamically build wix installers

build, dynamic, parameters, path, wix

Solution

As already answered, you need to pass the variables into WiX. We use Nant instead of MSBuild, but the concept remains the same.

Here's a Nant example passing in half a dozen variables to candle (it's not the cleanest example, but is lifted verbatim from a project I worked on)

<candle   out="${dir.obj}\"
          rebuild="true"
          extensions="WixUIExtension;WixNetFxExtension">
    <defines>
        <define name="ProcessorArchitecture" value="${release.platform}" />
        <define name="SourceDir" value="${dir.source}" />
        <define name="version" value="${version}" />
        <define name="releasetype" value="${release.type}" />
        <define name="Language" value="${language}" />
        <define name="product" value="${string.product}" />
        <define name="productedition" value="${release.productedition}" />
    </defines>

    <sources>
        <include name="*.wxs" />
        <include name="..\Common\*.wxs" />
    </sources>
</candle>

<!-- Define fallback culture for non-US -->
<property name="cultures" value="${language}" />
<property name="cultures" value="${language};en-US" unless="${language == 'en-US'}" />

<light
  out="${dir.build}\setup_${release.platform}_${release.compressionlevel}.msi"
  extensions="WixUIExtension;WixNetFxExtension;WixUtilExtension"
  cultures="${cultures}"
  rebuild="true"
  suppressices="ICE03;ICE82"
  suppresspdb="true" >


    <arg line="-loc &quot;setup-${language}.wxl&quot;" />
    <arg line="-sw1101" />

    <arg line="-b ${dir.resources}" />
    <arg line="-b ${dir.resources.common}" />
    <arg line="-b ${dir.resources.common}\Microsoft" />
    <arg line="-b ${dir.source}" />
    <arg line="-dcl:${release.compressionlevel}" />
    <arg line="-dWixUILicenseRtf=EULA_${language}.rtf" />
    <sources>
        <include name="${dir.obj}\*.wixobj" />
    </sources>
</light>

Problem

I am a student developer and I have built several installers for the company I am working with now. So I am fairly familiar with WIX. We recently decided to have a Build server that auto builds our solution. It builds both debug, and release, as well as Obfuscated (and non obfuscated) projects. And you really don't have to understand any of this. All you have to understand is that I have the same Wix project building different MSIs dynamically. So the way we build them is we call MSBuild.exe with several parameters. Parameters the wix project depends on. So let's say we go into command prompt and write ``` C:\>\windows\Microsoft.NET\Framework\v3.5\MSBuild.exe MyApp.Install\MyApp.Install.wixproj /p:Configuration=Release /p:SpecialPath=Obfuscated /t:Build ``` The idea is that wix sees the "SpecialPath" parameter being assigned "Obfuscated"; and in the installer paths its source to `..\myApp\bin\$(var.SpecialPath)\myApp.exe` which translates to `..\myApp\bin\Obfuscated\myApp.exe` when built. TheQuestion How do you create those custom build parameters and have them passed to my .wxs file. As of now with this setup, `$(var.SpecialPath)` is not defined and the build CrashSplosions. For obvious legal reasons I had to cut 90% of the project.wxs file out and rename some stuff, but for all intents and purposes this is what I have. ``` <?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" Name="myApp" Language="1033" Version="$(var.Version)" Manufacturer="myApp" UpgradeCode="$(var.UpgradeCode)"> <Package Id="*" InstallerVersion="200" Compressed="yes" /> <Media Id="1" Cabinet="media.cab" EmbedCab="yes" /> <Directory Id="TARGETDIR" Name="SourceDir" > <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLLOCATION" Name="myApp"> <Component Id="myAppEXE" Guid="FD5EBC02-MY29-GUID-ACCA-61324C5F1B68"> <RegistryKey Root="HKLM" Key="Software\MyApp"> <RegistryValue Value="0" Type="string" KeyPath="yes"/> </RegistryKey> <File Id="MYAPPEXE" Name='myApp.exe' Source="..\myApp\bin\$(var.SpecialPath)\myApp.exe" /> </Component> <Component Id="EngineDLL" Guid="*"> <File Id="ENGINEDLL" Name='Engine.dll' Source="..\myApp\bin\$(var.Configuration)\Engine.dll" /> </Component> <Component Id="CommonDLL" Guid="*"> <File Id="COMMONDLL" Name='Common.dll' Source="..\myApp\bin\$(var.Configuration)\Common.dll" /> </Component> </Directory> </Directory> </Directory> <Feature Id="ProductFeature" Title="myApp" Description='All' Display='expand' Level="1" ConfigurableDirectory='INSTALLLOCATION'> <ComponentRef Id="myAppEXE" /> <ComponentRef Id="EngineDLL" /> <ComponentRef Id="CommonDLL" /> </Feature> </Product> </Wix> ```

Original source