2010-02-04 49 views
4

我正试图决定我在MsBuild与Nant之间的战争。我开始:停止服务,部署一些文件,重新启动服务。只要看看这两条链接,在南特这件事情就容易多了。nant与msbuild:停止服务

的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... 

南特: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> 

不知多所社区同意我的看法。在南特完成这样的基本事情要容易得多吗?当然是这样。在CDATA块的C#代码? WTF?

我们目前的构建过程是a)大量的bat文件b)大量的诅咒。我真的很想找到一个很好的替代品,但那个MsBuild的东西看起来像是我眼中的一个痛苦的世界。我正在考虑的方式是在Nant中构建脚本,然后使用MsBuild来完成需要完成的任何.NET构建。

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

回答

7

您可以轻松地为使用的MSBuild每一位执行sc.exe ...

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

默认情况下,这将“失败”如果(的sc.exe)的退出代码为非零值,但可以定制。

+0

你能然后换行Exec的在foreach?也许这就是我的帖子中奇怪的命令脚本的原因? – jcollum 2010-02-04 16:14:49

+0

MSBuild并没有真正的foreach,因为它是声明性的,不是强制性的。你需要做一些事情,比如''你有一个' '... – 2010-05-28 15:28:21

4

随着南特,还有其他两种方法来停止服务,并且可以跟踪错误。

第一个(使用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,'.')}" /> 

注意,第二行验证服务已经存在和正在运行,这使得跟踪任何奇怪的错误。

1

除了为MSBuild提供的@nulpptr's回答以外,如果您没有使用社区任务的选项,您可能不得不求助于等待您的服务停下来继续前进。如果您有资源工具包,则可以使用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" /> 
+0

感谢您的ping提示! – DotNetDeveloper 2013-08-28 08:25:58