我正试图决定我在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构建。
一个重要的问题:在脚本运行之前哪个更擅长捕获脚本中的错误?我想在这里滚动自己,这是非常重要的一部分:排列所有数据并确保在尝试运行之前有意义。
答案 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" />