Mergers

Fragments help divide a large package into manageable chunks of source code and make developer co-operation and code reuse possible. Therefore, it is best suited to in-house development where WiX source code can and will be shared. But there is another mechanism capable of providing complete installation packages for other parties to use: merge modules. If, say, your product A depends on product B of another vendor, you can use their merge module meant to install their product and make it a part of your own so that both will be installed at the same time.

Setting up a merge module is very similar to the standalone source files we've used so far. However, instead of a Product, we specify a Module tag. Unlike with earlier packages, here we have to provide a unique GUID ourselves:

<?xml version="1.0" encoding="windows-1252"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Module Id="File1" Language="0" Version="1.2.3">
        <Package Id="YOURGUID-8DEE-4410-990A-1802896C4209" InstallerVersion="100"
            Languages="1033" Manufacturer="dev" SummaryCodepage="1252" AdminImage="no" />

        <Directory Id='TARGETDIR' Name='SourceDir'>
            <Directory Id='ProgramFilesFolder' Name='PFiles'>
                <Directory Id='Acme' Name='Acme'>
                    <Directory Id='INSTALLDIR' Name='Foobar 1.0'>
                        <Component Id="File1" Guid="YOURGUID-CF0E-40AB-ACC5-0E9A5F112628">
                            <File Id="File1.txt" Name="File1.txt" Source="File1.txt" KeyPath='yes' />
                        </Component>
                    </Directory>
                </Directory>
            </Directory>
        </Directory>
    </Module>
</Wix>

In our sample, we use a second merge module as well. Its source file almost identical to the previous one, with the following differences: we refer to a different file to deploy and we include a Dependency tag to indicate that the second module is dependent on the first one. For the dependency, we use the Module/@Id identifier with the module's Package GUID appended---but we have to replace the original dashes by underscore characters:

<Module Id="File2" Language="0" Version="1.2.3">
    ...
    <File Id="File2.txt" Name="File2.txt" Source="File2.txt" KeyPath='yes' />
    ...
    <Dependency RequiredId="File1.YOURGUID_8DEE_4410_990A_1802896C4209"
        RequiredLanguage="0" RequiredVersion="1.2.3" />
</Module>

To create a unified installation package, we write a usual standalone WiX source file:

<?xml version="1.0" encoding="windows-1252"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Name='Foobar 1.0' Id='YOURGUID-86C7-4D14-AEC0-86416A69ABDE' UpgradeCode='YOURGUID-7349-453F-94F6-BCB5110BA4FD'
    Language='1033' Codepage='1252' Version='1.0.0' Manufacturer='Acme Ltd.'>

    <Package Id='*' Keywords='Installer' Description="Acme's Foobar 1.0 Installer"
      Comments='Foobar is a registered trademark of Acme Ltd.' Manufacturer='Acme Ltd.'
      InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />

    <Media Id="1" Cabinet="product.cab" EmbedCab="yes" />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
        <Directory Id='Acme' Name='Acme'>
          <Directory Id='INSTALLDIR' Name='Foobar 1.0'>

Instead of the usual components, we refer to the merge modules. The SourceFile mentions the .msm files:

            <Merge Id="file1" Language="1033" SourceFile="Module1.msm" DiskId="1" />
            <Merge Id="file2" Language="1033" SourceFile="Module2.msm" DiskId="1" />

          </Directory>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="Msm" Title="Msm" Level="1">
      <MergeRef Id="file1" />
      <MergeRef Id="file2" />
    </Feature>

  </Product>
</Wix>

You can download the complete SampleMergeModule. You need to build the merge modules separately:

candle.exe Module1.wxs
light.exe Module1.wixobj

candle.exe Module2.wxs
light.exe Module2.wixobj

candle.exe SampleMerge.wxs
light.exe SampleMerge.wixobj