How to include heat generated wsx files in a smart way in wix installer?

It's a WPF application, with Wix Installer.

I have resourceses folder and I want to include these files in the installer to put next to the executable. I solved generating a resources.wxs file with necessary information about the files under the resources folder using the heat tool. I managed to includ into the main wxs file. For that reason I modified the .wixproj file, adding a before build target action to generate the wxs and include it in the main wxs.

Concern: .wixproj is kind of hidden, there thing that you cannot modify from visual studio, like adding a before build action (pre build action is a different story)

Question: How can I extract the before build action into a separate file?

The before build action in the .wixproj:

<Target Name='BeforeBuild'>
<Exec Command='"%WIX%bin\heat" dir $(SolutionDir)resources -dr ResourcesDir -var var.ResourcesDir -cg ResourceFilesGroup -gg -g1 -sfrag -srd -out $(ProjectDir)Resources.wxs' />
<ItemGroup>
  <Compile Include='$(ProjectDir)Resources.wxs' />
</ItemGroup>

Upvotes: 0

Views: 2173

Answers (1)

Tom Blodget
Tom Blodget

Reputation: 20802

You can extract it into a separate file—most project file types do that already. That's how they provide common targets to all projects of a type. A .wixproj has this:

<Import Project="$(WixVersionTargetsPath)" />

To augment your own, simply:

Create an XML file like:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
   <Target Name='BeforeBuild'>
        <!-- tasks -->
    </Target>
</Project>

Add an Import element inside the Project element and refer to that file:

<Import Project="custom.targets" />

If such a file primarily has Target elements, the convention is for it to have the file extension ".targets".

But there are two drawbacks with Visual Studio:

  1. Visual Studio caches all the project file dependencies and runs the MSBuild internally. So, it you edit the external file, it won't be part of builds using Visual Studio until the project is next loaded. To quickly unload and reload a project, use the project context menu in the Solution Explorer. Workaround: Call MSBuild yourself.
  2. When Visual Studio loads a project, if it includes non-standard external files, it gives a warning. (You can disable it per user by project file path, in the registry, if I recall.)

As an alternative to calling heat directly, you might want to look at the Harvest* targets that WiX provides. Note: As the documentation says, you don't invoke them directly (they're already invoked by the Build target); You simply add items to the ItemGroup they process and set properties they use.

Upvotes: 2

Related Questions