As I was creating, few months back, some Windows service I also created
MSI installer, using WiX, for it. Pretty straightforward – bunch of files in one
ServiceControl. Then as the service started to gain some features I had referenced some assemblies. So I had to always update the installer script to include new files. This turned out to be main problem, because I forgot it quite a few times. So I decided to script it.
Scripting is good. At least if done properly. :) In my case I made a small mistake. I created a simple PowerShell script that loaded the
WXS file, listed all
*.exe files in
bin directory (plus some other files) and created items in
Component. Nothing special. Right? It only had a one small gotcha. I’m pretty sure it’s described in documentation very likely, but … you know. The problem was that the script was creating the items in
Component in no particular order. To be precise it was listing the files and adding lines like stack. And last files processed were the other files. The installer was created fine, no error. Even the installation went well. Until it reached the point where the service should be started. It was failing. Consistently. Of course I was really installing (I mean finishing the installation) few weeks after I did this refactoring. Before, just seeing it started was fine for me. And I had no clue what’s going on. I compared the old
WXS file with new one. Except for formatting and some ordering it was same. Event Log was saying nothing. Full verbose logging install was not giving any clue. After like two hours wasted I was getting out of bullets. But then I realized something. The
ServiceControl element has a “reference” to the service executable. How’s the installer going to know what service to install and run? Yes, the service executable needs to be first in list of files. When I realized it I knew I read it somewhere. Quickly fixing the PowerShell script and I was fine.
Although I thought my “refactoring” was fine, because the all the files were there and the installer even installed these, I messed the order. Order matters. Lesson learned.