如果我是你,我实际上会混合MSBuild和MSDeploy。你应该让你的MSBuild脚本执行像启动/停止服务等操作。然后让MSDeploy到文件副本。使用MSDeploy,您可以使用-whatif
开关来指示您只需要执行操作的报告,而不是实际执行操作。不幸的是,MSBuild不提供这种开箱即用的选项,您必须将其“构建”到脚本中。你可以用属性和条件来做到这一点。例如,它可能是这个样子:
<Project ...>
<PropertyGroup>
<!--
Create the property to use, and declare a default value.
Here I've defaulted this to true because it is better to force the
caller to explicitly specify when to perform the action instead of it
being the default.
-->
<SimulateExecution Condition= '$(SimulateExecution)'==''>true</SimulateExecution>
</PropertyGroup>
<Target Name="Deploy">
<Message Text="Deploy started" />
<Message Text="Stop service ABC on server Z"/>
<WindowsService ... Condition=" '$(SimulateExecution)'=='false' "/>
<Message Text="Stop service DEF on server Z"/>
<WindowsService ... Condition=" '$(SimulateExecution)'=='false' "/>
<!-- Call MSDeploy with the Exec task. -->
<PropertyGroup>
<MSDeployCommand>...\msdeploy.exe YOUR_OPTIONS_HERE</MSDeployCommand>
<!-- Append the -whatif to the command if this is just a simulation -->
<MSDeployCommand Condition= '$(SimulateExecution)'=='false' ">$(MSDeployCommand) -whatif</MSDeployCommand>
</PropertyGroup>
<Exec Command="$(MSDeployCommand)" />
... More things here
</Target>
</Project>
对于您可以使用WindowsService任务从MSBuild Extension Pack服务行动。你将不得不填补那里的空白。
当您调用MSDeploy时,您应该只使用Exec任务来调用带有您的参数的msdeploy.exe。如果你通过了这个愿望,它不会实际执行这些行为,只是报告它会做什么。这些将被记录到msbuild日志中。所以如果你用/ fl调用msbuild.exe,你会得到这些操作写入文件。我采用这种方法时遇到的唯一问题是,对于msdeploy.exe,您多次必须使用完整路径(那些没有..),这有时会非常棘手,因此请谨慎使用此类路径。
@jcollum:那不够详细吗?在此没有听到任何关于你的消息。 – 2010-02-19 06:05:11
感谢您的信息。这似乎是我正在寻找的。 – jcollum 2010-03-02 20:09:35