2010-02-04 137 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