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.wxslight.exe Module1.wixobj
candle.exe Module2.wxslight.exe Module2.wixobj
candle.exe SampleMerge.wxslight.exe SampleMerge.wixobj