views:

381

answers:

8

I recently had to struggle with one installation project (which uses most popular product for creating installations: InstallShield) to make it work for product upgrades (migrating from one version to another). In the end it turned out that I needed to use one long package code but was using some other. It wasted my 8 hours (testing and debugging installers is a pain).

Now if I think about it, once you are done all the hard part of coding, all you want to is that correct applications, libraries are copied to target computer and user just runs it. Period. This apparently simple task normally turns out to be a tricky one and "being closed to finish date" makes in even harder.

  1. Don't you think deploying a product is made damn difficult on windows which should have been simpler? (or installer really deserves that much attention and I am just being crazy about it?)

  2. Have you ever used simpler deployment schemes such as "copy the folder to wherever you like and run the exe. When you want to remove it, just delete the folder!"? Was it effective and made things simpler?

+1  A: 

Have you looked at NSIS: http://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System ?

And 1: Yes, 2: No

Jonathan Parker
A: 

For exactly the reasons you state, we've done internal releases, handled by the dev team by copying the required files, and then done the rest of the setup using scripts and our own utilities.

However, for end users you have to have some kind of hand holding wizard, I've used the MS installer from within VS and found it confusing and clunky. After that experience I've avoided the pain by getting others to do the installation step. Can anyone recommend a good .Net installer?

MrTelly
A: 

I use Installshield and if you are not trying to do anything too fancy (I why would you) then it's pretty straighforward - set initial setting, select files, set up shortcuts and create setup.exe.

All future updates I handle inside my code - much more convinient to the user

Riho
So if version 1.0 is installed on a user's machine and he now wants to install version 2.0. what steps he needs to take in your case? (I believe he will need to uninstall version 1.0 first if you dont use installer upgrades)
Hemant
Doesn't work on Vista. Unlike installers, your own app cannot (and should not) write in \Program Files\
MSalters
@MSalters: Works fine on Vista (and all other versions of NT when not Admin) - you should give your setup/update .exe a UAC manifest to say "I need elevation" to be nice to the user, though. Self-update just needs to use an external process (*after* checking for new version!).
Simon Buchan
I use Delphi 3rd party update components - it downloads the new files from internet then executes updating process (replaces old files with new) and then restarts program.
Riho
+2  A: 

Well, its a lot easier if you build your installer first, make it part of your build system, and let it grow with your project.

I agree, the windows installer drives me insane. But there are a lot of situations that xcopy just doesn't solve. Sometimes you want to install for multiple users, not just the current user. Sometimes you have to register COM objects. Sometimes you have to make a whole bunch of changes to the system, such as registering services to run at startup, connecting to network servers, etc. Sometimes you have users that can't use a command prompt. And you always want to be able to role the whole thing back when something fails halfway through.

Was the whole MSI database approach the best way of doing it? I'm not sure. Would I rather pound nails into my head than write another line of WiX code? Probably. But you have to admit, it does a good job of doing everything you could ever possibly want. And when it doesn't there is always the CustomAction option.

Really, what I would like to see, is better documentation (really, what is a type 50 action? How about giving it a name?) and a lot more easy-to-usurp templates.

And the WiX users group alias does a good job of answering questions.

You should read RobMen's blog. He does a good job explaining why things are the way they are. He has done a lot of thinking (more than any human should) about the problems of setup.

jeffamaphone
You are right about making the installer part of build system but when I said "closer to finish date" I meant "closer to development finish date" which means before giving first build for beta testing.I have heard recently about WiX. Is it any simpler or more transparent? Should I give it a go?
Hemant
Well, you should read the tutorial and decide for yourself. See: http://www.tramontana.co.hu/wix/
jeffamaphone
Personally I think InnoSetup is easier to use: http://www.innosetup.com/isinfo.php
jeffamaphone
A: 

"Once you have done all the hard part of coding", you haven't done a thing if all your hard work doesn't install. Installers need to be built and tested on every nightly build, every night, almost from day one. You need to test that the installer can be built and run, and you need to verify the installation.

Otherwise, who cares how much hard work you've done coding - nobody will ever see your work if it doesn't install!

Note that this also applies to XCOPY.

Another thing: what is your QA testing if they're not testing what your installer installs? You have to test what the customer will get!

John Saunders
I am not sure what gives you an impression that *our* QA testing doesnt involve testing the installers. When I said "close to finish date", i mean "close to development finish date" which is followed by product validation phase which does exactly this > "testing what customer gets"!
Hemant
Interesting. I'm more accustomed to testing throughout the development cycle; not waiting until development is "complete" to start finding bugs.
John Saunders
+6  A: 

Painful as it is you need to wrestle with the windows installer for the benefit of your customers. Otherwise you will need to do a lot more work to

  1. Handle situations where for some reason an error occurs during the installation. What do you do next?
  2. Handle issues like security. What if the installing user does not have rights to particular folders/registry keys?
  3. Correctly cleanup after installation
  4. Patching and patch management
  5. Performing additional tasks -- registering COM objects, creating databases, creating shortcuts, creating an un-installation shotcut and so on
  6. Installing prerequisites
  7. Letting users choose which features to install

Your own custom scripts to solve all these problems eventually become a bigger problem than the installation itself!

I recommend that you check out Wix. It's not exactly child's play but it gets the job done. If you install Votive as a visual studio add in you get intellisense to help you strucutre the tags correctly. With the help file you can create pretty functional flexible installations

Conrad
I've used both WiX and the GUI installation builders. I found WiX much easier to use since the install script becomes just another piece of code written in a declarative language. You can see the logic in one place rather than constantly navigating a tree structure trying to piece the logic together
Ferruccio
All with Ferruccio on this one. WIX is the developer's deployment method, hands down. MSI does not, and will not make sense to most developers. Deployment is a field that falls between development and system administration. As such it is "crossing the chasm" between the world of the end user and that of the developers of applications. WIX is "written as source code" (if we can call XML source) and then compiled and linked the normal "developer way". It is also highly stable and well written. If you are a developer and need to do deployment and you have a choice, there is no choice, it's WIX.
Glytzhkof
+1  A: 

Personally, I mostly agree with @Conrad and @John Saunders. I wrote about this topic a long time ago on my old blog. I think @jeffamaphone has a point about the Windows Installer complexity (and my over attention to setup, in general ) but I believe the Windows Installer is still the best all round option for installation on Windows.

Rob Mensching
+3  A: 

I don't think you'll see too many disagreements here, especially regarding MSI. I think one thing to keep in mind is to watch the way many programs are using MSI files these days. Displaying UI dialogs and making complex configuration choices with an MSI is very weak simply due to the way Windows Installer was designed, so I've noticed a lot of programs being split into a bunch of baby MSIs that are installed with the minimal UI by a parent setup program. The SQL Server 2008 setup wizard does this. UPS WorldShip does this. And Paint.NET does this, too--the wizard you see is a Windows Forms app, and it launches msiexec itself (you can see the minimal UI of the Windows Installer pop up on top of the white wizard window), passing any configuration parameters as property arguments to msiexec.

A common scenario where this comes up is where someone is tasked with building an installer for an application that has both server and client counterparts. If the user chooses the server option, then they may or may not want a new database to be installed, which means installing SQL Server. But you can't just install SQL Server while you're in the middle of your own installation because Windows Installer won't let you do that. So a frequent solution is to write an app that displays a wizard that allows the user to configure all of the setup options, and then your app launches the MSI files as needed for SQL Server, your server application, and your client application in the minimal UI mode; basically, eschewing the "features" aspect of Windows Installer entirely and moving it up to the MSI level. 4.5's multiple-package installations seems to be a step further in this direction. This format is also especially useful if you also need to loop in non-MSI installers from third parties as part of your installation process, like installing a printer driver for some bizarre point of sale printer.

I'll also agree that Windows Installer lacks built-in support for common deployment scenarios. It's meant for when setup isn't XCOPY, but they seem to miss the fact that setup usually isn't just "files + shortcuts + registry keys," either. There are no built-in actions for setting up IIS Web sites, registering certificates, creating and updating databases, adding assemblies to the GAC, and so on. I guess they take the opinion that some of this should happen on first run rather than being a transactional part of the install. The freely available tooling and documentation has been awful--flat out awful--for the better part of a decade. Both of these issues are largely addressed by the WiX project and DTF (which lets you finally use managed code custom actions), which is why we're all so grateful to Rob Mensching and others' work on that project.

I've had the same experience. Installation can quickly suck up your time as you go down the rabbit hole of "Oh God, I guess I have to become an expert in this too." I second the idea that's it's best to address it early on in your project and keep it maintained as part of your build process. This way, you can help avoid that scenario of having developed a practically uninstallable product. (Trac was an example of this for a while, requiring to track down specific versions of weird Python libraries.)

(I could go on about how Windows Installer sometimes decides to use my slow, external USB hard drive as a place to decompress its files, how it seems to sit there doing nothing for minutes on end on computers that have had lots of MSI installs on them, and how that progress bar resetting itself a bazillion times during a single install is the most idiotic thing I have ever seen, but I'll save those rants for another day. =)

My two cents; please note that I really just know enough about Windows Installer to do damage, but this is my assessment coming from a small business developer just trying to use it. Good luck!

Nicholas Piasecki