WiX Wednesday Part 1.1: Using Features To Call Components

Feature tags are used when we want the WiX project to actually do something. It’s usually a step after we have defined the file location of whatever it is we want to drop. Let’s say we have declared the folder location “bin” already. Typically we’d want to declare dropping any dlls at the end of the product.wxs file, after we have created the drop location. The reason I  like to do it this way is that it creates a logical organisation to the WiX file.

    <Feature Id="ProductFeature" Title="RP.Nix" Level="1">
      <ComponentGroupRef Id="Bin"/>
      <ComponentGroupRef Id="Services"/>
    </Feature>
</Product>

The ID is always unique to the Feature tag, as is the Title. The Level is always defaulted to 1. If you want to disable this feature, then change the level to 0. As you can see, you can have more than one child element referenced in the Feature tag. In this feature we have a ComponentGroupRef which is a reference to a ComponentGroup in another fragment.

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<ComponentGroup Id="Bin">
<ComponentGroupRef Id="Commands"/>
<ComponentGroupRef Id="Queries"/>
</ComponentGroup>
</Fragment>
</Wix>

You can even embed another ComponentGroupRef within the ComponentGroup. You might want to do this to keep the size of the files within your solution down.


<ComponentGroup Id="Commands">
<ComponentRef Id="FILE_$(CommandDll.TargetFileName)" />
</ComponentGroup>

At the base of this all is the Component tag, in which we create our action. Here we are just copying 1 dll in the solution, but if you have 40-50 you may want to logically group them to save having a 1000+ line xml file that may crash Visual Studio…

<DirectoryRef Id="Bin">
<Component Id="FILE_$(CommandDll.TargetFileName)"
Guid="{1CCFC954-2373-42A0-B5CA-D72D83C0F7F8}" >
<File Id="$(CommandDll.TargetFileName)"
Name="$(CommandDll.TargetFileName)"
Source="$(var.CommandDll.TargetPath)" />
</Component>

Summary

Above is a very simple example of using a ComponentGroupRef to call into another fragment into another file. Within that ComponentGroup we can place more ComponentGroupRef tags to other ComponentGroups. Or we can add a ComponentRef tag to a particular Component that we want executed. The structure is down to the user.  I tend to use Features and Components to help organize the installer project in Visual Studio into similar actions, like copying dlls or finding and replacing text in the web.config.

Sources

  1. Download WiX from CodePlex here.
  2. As I said, I don’t think the manual for WiX is all that great. It feels like it’s been written by an expert in WiX for an expert in WiX. But I guess at least there is a manual.
  3. There’s also a very comprehensive tutorial written about WiX that explains it in far greater detail than I have here. It also provides plenty of examples. Such as in the advanced sections there is a tutorial on creating your own custom UI.
  4. I’ve probably short-changed msiexec. Aside from running msiexec /? in the cmdline, there’s plenty of examples on the TechNet site.
  5. There’s even a book available! I’ve not read it, however the reviews on amazon.com seem positive. For such an esoteric piece of software, and at a reasonable price it’s worth a go? Maybe I’ll buy it and review it at the end of this series….

Author: Richie Lee

Full time computer guy, part time runner. Full time Dad, part time blogger. Knows a thing or two about Pokémon. Knows too much about SQL Agent. Writer of fractured sentences. Maker of the best damn macaroni cheese you've ever tasted.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s