I'm trying to build a general understanding for what's common in this situation so that I can decide if it makes sense to pursue it further.

  1. Are installers welcome in a typical corporate environment with the following?
    • Change control process
    • Dev/QA/Production environments
    • Designated deploy teams for various areas (firewall, database, windows, etc.).
  2. Is there a "litmus test" that could be applied to an application to see if it is a good candidate for creating an installer? *
    • Are installers simple enough that every application should have one?
    • Are installers even the right tool?
  3. Is it reasonable to expect developers to learn something like WiX to support installers?
    • Maintainability in general is a concern, i.e., is creating an installer a niche skill?


For example, I have a set of winform applications that are in a shared directory on a production server. Specific groups can run the applications from this directory but only system admins can modify the executables. The current deploy process involves having an admin copy/paste the executables and libraries to the shared directory.

Since the applications are not installed on the individual users' machine, does it make sense to create an installer for deploying new versions of these applications to the shared directory?


I felt that the answers here gave some solid advice so I wanted to share what I came up with for my current project where I needed to build a large number of applications and deploy them to individual folders.

I found a NuGet package called _PublishedApplications that mimics the behavior of _PublishedWebsites for web projects. The idea is you install the NuGet package to your projects and it adds a target that will copy the build artifacts to a _PublishedApplications directory in the output path. This behavior is activated by running MSBuild from the command line and specifying an outdir property:

msbuild /p:Configuration=Release /p:outdir=C:\path\to\outdir MySolution.sln

This will give you a directory structure similar to the following:

  • C:\path\to\outdir
    • _PublishedApplications\
      • Project1\
        • dlls, exes, etc.
      • Project2\
        • ...

From there, creating a zip that can be extracted in the various environments is fairly painless.

  • 6
    If you must provide an installer, can you provide a .msi installer? Those, at least, can be fully automated with minimal pain. (while still being comprehensible for the occasional user that needs to do his own updates)
    – ZJR
    May 13, 2013 at 15:20
  • To your example: I have a script which tries to rename the production directory to a temporary name, copies all application files into the renamed dir, and then renames the production directory back to its old name (and it does error checking after each(!) step). The advantage is that as long someone uses the old version, the first renaming fails and you don't incidentally destroy the production environment. A good admin may be able to create such scripts by himself, but others may be thankful if you provide such an "installer" for them. Depends really on you organization.
    – Doc Brown
    May 13, 2013 at 15:36
  • @Mark0978: do I smell a "Linux" vs. "Windows" rant here? This is 100% off topic here.
    – Doc Brown
    May 17, 2013 at 6:31

4 Answers 4


An installer always makes sense, if deployment requires anything more complicated than copying the relevant file(s) to some folder and running the EXE. If there are additional steps that need to be taken to set the product up properly, there's two ways to go about it.

  1. You can write out a list for someone to follow. Humans being humans, someone's bound to screw it up, and then call you up asking for help because your program isn't running right.
  2. You can write out a list for a computer to follow (an install script). This makes it much less likely that user error will screw up deployment.

On the other hand if you don't have any setup tasks that need to be performed, then just give them a zipfile. That's simpler than running an installer.


Wyatt takes off his programmer hat and puts on his Director of IT hat

If this is an internal line of business application then you only need aim at one environment -- said business. I would call the head of IT and ask him how they would like to manage deployment. IT departments have been dealing with this for a while so they might have a strong preference for xcopy or MSI-based options or something else entirely such as your current option.

I'll add that department would at the very least appreciate the gesture and could likely become a valuable ally as chances are they know more about the existing line of business app and problems than you realize.

  • 5
    +1 Ross borrows Wyatt's hat and adds that IT teams love installers because they leave a fingerprint behind that says "this thing is installed". May 13, 2013 at 23:06
  • 3
    My IT hat says build it in HTML5 and quit installing things on desktops!
    – boatcoder
    May 17, 2013 at 1:55

Windows Installer applications are widely used to install internal business applications in environments using Windows. You should also ask yourself whether over the application's life it will likely ever need to be updated, patched, repaired, or cleanly removed from user's systems. In many cases the answer is "yes" - in which case having a properly written installer can reduce the total cost of maintaining the application over time. There are other services and features designed to work with Windows Installer, such as Restart Manager and WMI and product and patch inventory functions. If your application can benefit from these, then that's another reason for including an installer.

The upfront costs to develop a useful installer for your application may pay off in the long term, and the costs of development can be mitigated by selecting an appropriate Windows Installer authoring tool, such as WiX or InstallShield or another.


As with all engineering decisions, it depends.

Probably the most important factor is to understand who the consumer of your installation process is and what skillset the development team has.

Since it's internal, I assume it's deployed by an internal IT department. They are probably no strangers to command shells.

Graphical install wizards are useful for software that is distributed to external customers directly because simple assumptions about your configuration are no longer valid, such as file server locations, security policies, etc. Therefore, you need to guide each user through picking settings themselves.

In your environment, this stuff is probably dictated by either development or IT and rarely change. Therefore, I recommend using shell scripts to copy files around to the appropriate place. The scripts should live within your product as part of the package that is released. It should also be version controlled along with your app.

Where I work, our entire web application is installed via an InstallShield wizard, which asks a bunch of questions, most of which are file system locations, db connection information and other settings that just end up in config files. It's difficult to automate. Since the web app installation at its core just created a couple of databases and copies files, I am writing a new installer using either Ant or Powershell which simply runs .sql files and copies files.

Then everybody can understand how it works and maintain it more effectively.

  • I think deploy scripts would be a viable solution for what I need. I was concerned that it might be reinventing installer functionality and so I was looking to see if maybe it would be easier to go the route of an installer. From your answer it sounds like installers might be overkill as well as not being easy to maintain. May 13, 2013 at 15:19
  • Exactly. It is re-inventing installer functionality, but it's the installer that is likely overkill.
    – Brandon
    May 13, 2013 at 15:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.