Hello,
I have a question especially for those who have experience with these kind of things.
I want / need to build an installer for an application that has several dependencies.
On the lowest level there are some device drivers (these come with a separate installer that can be called and installed silently), then there are some windows services that communicate with these drivers which come either with a separate installer too, or as a xcopy deployment where we need to register the service manually.
Also, depending on the target environment, it is one out of three possible device drivers and also one out of two possible services. Which driver goes with what service is fixed, so a selection of a specific driver (for a specific hardware device) will require a certain service and disallow installation of the other.
Lastly its the application to install. Some parts also needs some configuration (some values need to be written in some files). So we can either ask the person installing for the values in GUI, or pass them as command line args.
When the application already is installed, the setup should be un-doable in case something gets wrong with an update. So there needs to be a way to restore to the previous version. We can use a file-based backup in beforeinstall for the xcopy services and the application, I still need to figure out what can be done with the drivers.
Additionally to the installation, there should also be some way for a bit of configuration for all components. I know that the Git for Windows installer also allows even conditional configuration (only configure stuff that's not yet configured), which is a feature I love. Need to check out how they did that.
Lastly, the parts are versioned individually. So there might be only an updated service, and we would build a new combined setup only with that new service, and when installed it should ideally only update the single service that changed, and not touch the other components. Also in case of an issue, only this single service update should be un-doable.
Except for the undo-part I know that all of this, in theory, should be possible somehow, but for example for the execution of other embedded installers I found several ways to achieve this, some of them use tasks, some use afterInstall (I don't like that, as the application should not install before the dependencies aren't properly installed).
After all, there seem to be a LOT of possible ways to achieve this.
Now my question is, what are the suggested / best approaches to such a complex installation scenario? Also, is there a suggested approach to take on such a project? Are there any best practices you can suggest? I want to come out of this with a maintainable installer that is more or less foolproof to use (for most degrees of fool ;) ).
The main reason for this project is to provide a single installer for customers to be able to setup the whole thing by themselves. The current way is that a support agent remotely installs all parts manually, because the customer can't (or shouldn't) be bothered with all the parts of this complex installation.
Thanks for your suggestions,
Sebastian