nant与msbuild:停止服务

时间:2010-02-04 02:31:23

标签: msbuild build-process nant

我正试图决定我在MsBuild与Nant战争中的哪一方。我开始:停止服务,部署一些文件,重新启动服务。只是从查看这两个链接,在Nant中更容易做到。

MSBuild:Example of using Service Exists MSBuild task in Microsoft.Sdc.Tasks?

<target name="service_exists"> 
        <script language="C#"> 
                <references> 
                        <include name="System.ServiceProcess.dll" /> 
                </references> 
                <code><![CDATA[ 
                        public static void ScriptMain(Project project) { 
                                String serviceName = project.Properties["service.name"]; 
                                project.Properties["service.exists"] = "false"; 
                                project.Properties["service.running"] = "false"; 

                                System.ServiceProcess.ServiceController[] scServices; 
                                scServices = System.ServiceProcess.ServiceController.GetServices(); 

                                foreach (System.ServiceProcess.ServiceController scTemp in scServices) 
                                { 
         etc... 

Nant:http://ryepup.unwashedmeme.com/blog/2007/01/04/restart-a-windows-service-remotely/

<!-- Send the stop request -->
<exec program="sc.exe">
  <arg line="\\server stop shibd_Default"/>
</exec>
<!-- Sleep a little bit, to give the service a chance to stop -->
<sleep seconds="5"/>
<!-- Send the start request -->
<exec program="sc.exe">
  <arg line="\\server start shibd_Default"/>
</exec>

我想知道SO社区是否同意我的看法。在Nant中完成这样的基本操作会更容易吗?当然看起来那样。 CDATA块中的C#代码? WTF?

我们当前的构建过程是a)许多蝙蝠文件b)大量的诅咒。我真的很想找到一个好的替代品,但MsBuild的东西看起来像是一个痛苦的世界。我想要走的路是在Nant中构建脚本,然后使用MsBuild来完成需要完成的任何.NET构建。

一个重要的问题:在脚本运行之前哪个更擅长捕获脚本中的错误?我想在这里滚动自己,这是非常重要的一部分:排列所有数据并确保在尝试运行之前有意义。

4 个答案:

答案 0 :(得分:8)

在msbuild中,您还可以使用msbuild community tasks中打包的ServiceController任务。

答案 1 :(得分:7)

您可以轻松地使用MSBuild执行sc.exe ...

<Exec Command="sc.exe \\server stop shibd_Default" />

默认情况下,如果退出代码(sc.exe)非零,则会“失败”,但可以自定义。

答案 2 :(得分:4)

使用Nant,还有其他两种方法可以停止服务,其中一种方法可以跟踪错误。

第一个(使用Net Stop):

<exec program="net" failonerror="false"><arg value="stop"/><arg value="${serviceName}"/></exec>

第二个(更清洁):

<servicecontroller action="Stop" service="${serviceName}" if="${service::is-installed(serviceName,'.') and service::is-running(serviceName,'.')}" />

请注意,第二行验证服务是否已存在且正在运行,这可以跟踪任何奇怪的错误。

答案 3 :(得分:1)

除了@nulpptr's MSBuild的答案之外,如果您没有选择使用社区任务,则可能需要在执行操作之前等待服务停止。如果您有资源工具包,则可以使用EXEC命令使用sleep任务。

没有资源包吗?使用ping技巧......

但是,如果您没有资源工具包,则可以使用ping技巧强制延迟。例如,以下内容将使用sc命令停止服务,然后暂停约5秒钟:

<Exec Command="sc.exe \\server stop shibd_Default" ContinueOnError="true" />
<Exec Command="ping 127.0.0.1 -n 5 > nul" ContinueOnError="true" />