Firstly, nested installs are evil. Let me tell you why. They can never be patched and cannot be cleanly removed from the target system. That alone should drive you away from using nested installs. You perform a nested installation. And Boom! The next thing you know is that you have lost control over the life cycle of your application, your house has been burgled and your wife has run away with your neighbor. Well, it was a slight exaggeration but you get the picture.
A smarter way to handle this, as many argue would be to call the child install by launching the MSI package's setup.exe or launch msiexec and pass appropriate command line parameters to install the package. This is equally bad. Such installations do not have their rollback logic integrated with the parent installer. Thus if the nested setup fails, you do not have any way to roll back the parent setup reliably or the vice-versa. Furthermore, Windows Installer's architecture allows only one installation at a point to make changes to the system. Having two installations modify system resources might not be the smartest thing to do.
The only way out of this mess is to use something called as the Merge Module. Merge Module is an atomic unit consisting of components, custom actions and various resources like files and registry entries. These merge modules can be integrated into the main installer at design time by the merge tool. You can either use tools like InstallShield to include merge modules in the application or use WIX's
Beyond all this, if the setup were a third party setup, you would have to use the MSI package unless the vendor agrees that you can repackage his setup. Buts lets just assume that he does not. Even in that case, it is recommended that you keep the logic of the third-party setup miles away from your application. You can handle the installation of the third party application from the bootstrapper. There are a couple of applications that do that. InstallShield X Premier and Professional editions have a neat feature called as Setup Prerequisites, which let you call other MSI or non-MSI based installations from the bootstrapper. If you would like to stay open source, then you can use DevAge’s DotNetInstaller to achieve the same. Both of them are very easy to use. InstallShield’s solution comes with a price tag, sporting a snazzy killer interface and excellent documentation. While the DotNetInstaller is not a setup creation program but is just a bootstrapper and it is free.
4 comments:
Gee... experience with nested installs speaks for itself...:-)... Good One V..Cheers..DS
Servicing merge modules is a headache. Imagine you are using merge mocdule from a 3rd party vendor 3PV. What if you find an issue with the resources carried by this merge module? How will you patch it. 3PV can not release a patch to a merge module and deliver it to your clients. Its a nightmare. Do not go down the merge module path if you ever think there will be bugs in 3-party vendor's SW.
Ditto on the merge module problem re: patches. It's bad enough to rely on a third party for delivering a security fix for your application; it's even worse if you're supplying the shared library and you want to patch it. How do you distribute your fix unless you track every product in the world that gets their hands on your merge module, and then how do you FORCE them to deliver the patch? Scary.
I believe that you might be focused on the wrong 'type' of parent installation. The 'parent' the calls or executes other installation should only be 'logic', not an actual file installation process. It avoids the 'roll back issue you referred to. Now you can avoid the 'roll back' issues with 'exit codes'
-T
Post a Comment