views:

79

answers:

4

Does NAnt have the ability to install or uninstall a windows service, using the InstallUtil utility or whatever else?

+1  A: 

Nant or MSBuild? What's the problem with just running installutil yourself - that's what you'd do in MSBuild. (In general, builds dont do the installs for things like this as rule as typically your build should be able to run on a random build server).

Another option, which would take installutil out of the equation is adding a self-install option to your service like this (have a search for more by looking for self install windows service)

Ruben Bartelink
NAnt, sorry for the confusion with the tags.
Brian
I have a more complicated process that runs outside of the service, so I would like to leverage everything with NAnt.
Brian
@Brian: Cool (I subscribe to the msbuild tag - Sticking on a build-automation tag. In general installutil isnt a bad approach (though [the bootstrapping issues with it](http://robmensching.com/blog/posts/2007/4/19/Managed-Code-CustomActions-no-support-on-the-way-and-heres) are definitely important to be aware of
Ruben Bartelink
+2  A: 

You can call Nant's exec task to call InstallUtil and can pass parameters to install or uninstall a service easily

 <target name="install-service">
    <exec program="${framework::get-framework-directory('net-2.0')}\InstallUtil.exe">
      <arg value="-i" />
      <arg value="/name=V1" />
      <arg value="C:\Service\SomeService.exe" />      
    </exec>
  </target>
mcaaltuntas
instead of hard-linking to the path of installutil.exe, you should use the nant functions to get the path of the framework first: framework::get-framework-directory('net-2.0'): http://nant.sourceforge.net/release/latest/help/functions/framework.get-framework-directory(System.String).html
Garo Yeriazarian
Thanks. you are right. i wasn't aware of this nant property.
mcaaltuntas
A: 

If you use the TopShelf Project in your application to host your services, you can get command-line based tools for installing / removing the services without needing InstallUtil.

ServiceName.exe service install ServiceName.exe service uninstall

And you can run the service directly and get a nice console window that you can CTRL+C to stop. You can integrate this directly into nant or msbuild by executing the program.

Garo Yeriazarian
I have a more complicated process than that, which is why I am using NAnt to consolidate...
Brian
If you just need something that will call InstallUtil on your services, then I recommend going with mcaaltuntas's answer. You can even wrap it in a <foreach> in nant that will iterate on all the .exe's or all the services and install it all for you.
Garo Yeriazarian
A: 

If your service can be installed at different places, you can also uninstall it through its name using SC.EXE, as follows:

<property name="serviceName" value="Name of the service"/>
<exec program="sc" failonerror="false" verbose="true" if="${service::is-installed(serviceName,'.')}">
 <arg value="delete"/>
 <arg value="${serviceName}"/>
</exec>
jcmeyrignac