Things have slowed down enough I was able to get around to fixing a small bug in Paraffin where I was accidentally including .ParaffinMold files in the .WXS output. Also, as I finally caught up with the cool kids and finally started using ReSharper. Since I love fixing bugs at compile time instead of runtime, I looked through the errors ReSharper reported and fixed all the ones that wouldn’t destabilize the code too much. You can always grab the latest Paraffin on GitHub: https://github.com/Wintellect/Paraffin.
(Moving to ReSharper has been interesting because I’m so used to using Visual Studio without it. There’s a lot of cheese moving going on but I’m slowly getting used to the ReSharper power. Yesterday in my Mastering .NET Performance Tuning virtual session someone commented that watching me struggle with the new keystrokes was like watching an old dog learn new tricks. That made me laugh out loud.)
For a while I’ve had two code changes people have submitted for Paraffin. In the end, I decided not to include them for now but thought it was important to get some more feedback from Paraffin users. The first change was from Jean-Francois Montpetit and was about making the .ParaffinMold files more useful. As a reminder, .ParaffinMold files are the way you can inject additional elements under the current directory when harvesting files.
Jean-Francois idea was that in the .ParaffinMold file you could specify the Component ID so that it would match a File source attribute so things like ServiceInstall elements, ServiceControl elements, and COM registration would be inserted in the component where the file is defined. I like the idea initially because it made a lot of sense. As I was working Jean-Francois’ idea in I kept stumbling when thinking about the update process. To work cleanly I was going to have to add code that looked for additional elements under a component to possibly remove elements that had been added previously, but were no longer needed. When I worked on an installer that had a bunch of services I put the Component element for the service .EXE, ServiceInstall and ServiceControl elements in a .ParaffinMold file and used a –regExclude to keep the services .EXE from being pulled in. That was super simple and kept the unique part of the installer in a self-contained location. In the end, I felt keeping Paraffin focused on dealing with the files harvesting was the way to go.
The second change I was sent from Robert Brunhuber and would allow you to override the input directory when updating a fragment. Robert wanted to be able to reuse the .WXS fragment for both Debug and Release builds and by providing a way to specify the directory to use on an update you gained some control. This is a feature that has been requested before, so I was originally thinking this would solve some problems. When I started talking with various people much smarter than I when it came to installers we all started questioning if this was a good idea. Because Paraffin is harvesting files changing the directory on updates could cause all sorts of havoc with component rules if something gets out of whack, such as having differences between the debug and release directories.
When I’ve asked people that have requested this feature they all were using Paraffin to harvest files and using the –update command line to keep existing GUIDs stable, but in the end renaming the .PARAFFIN files to .WXS as part of an automated process. My thinking is that if you’re updating the .WXS file automatically, you should probably just run Paraffin in the initial creation mode to generate the initial file every time and go with major upgrades so you don’t have to worry about anything. With that thought, I decided to not bring in the ability to change the directory on updates.
I very much appreciate Jean-Francois and Robert extending Paraffin to fit their needs and I wanted others to hear why I made the decisions I did. Additionally, I wanted to throw open the discussion to others using Paraffin. Would these options help you? Would you like to see other features? Let me know in comments here or on the Paraffin GitHub page