Tuesday, September 2, 2014

Authoring Very Large Installation Packages Using WiX

A while ago I was authoring an installation package for a customer.
The installation had abundance of files which I harvested using Heat.exe
When I got to running it an unfamiliar error message popped:

Or as it appeared in the log file:
2709: The specified Component name ('cmp8CD8B73AC8349972161D2AEAC3DDEE78') not found in Component table

Checking the MSI with Orca showed that the component was definitely present in the package.
Further investigation revealed an undocumented 65536 limit on component count - while  my customer's application had nearly 200,000 bitmap files.

After having thought of the issue for a while, I reached 3 alternatives to solving it:
  1. Splitting the installation to several products, each with no more than 65536 components
  2. Zipping the bitmaps into few archives and extracting them during setup
  3. Grouping multiple files into fewer components.
While all three alternatives are not perfect, the zipping option is quite outrageous. It generates modifications that Windows Installer isn't aware of, thus can't be rolled-back or un-installed properly.

The first option - splitting the installation to several products - was also cleared off the table due to inferior user experience.

That left me with grouping files into components as the best of imperfect options.
It does have pitfalls:
  1. It breaks component best-practices
  2. Files may be in-repairable since they are not key paths
Still, considering the product requirements and the alternatives, I decided on going with it.

Now... How was I to group 200,000 files into fewer components?
Having google'd that I concluded XSLT grouping using the Muenchian Method fitted just right.
With that I can group all the files within a directory to a single component. Since there were less than 65536 folders in my client's product, that was good enough for me.
I'll skip explaining the Muenchian Method itself since there's plenty of information about it on the web.

After implementing the grouping the installation passed perfectly.

I've assembled a project to demonstrate both issue and solution here.
To use the demo follow these steps:
  1. Download the code for wix-demo project
  2. Execute Grouping.bat to generate a folder hierarchy with 65550 files. 
  3. Build both projects - NoGrouping will produce the mentioned error, Grouping solves it.

No comments:

Post a Comment