我们正在评估MSBuild和Nant的部署过程。我们可以推出自己的工具。一个不同的业务部门 - 让我们称之为DeptA - 真的希望拥有(因为它更好地拥有它)是DeptA中某人能够阅读脚本并查看它将做什么的能力。目前我们使用.bat文件执行此操作。我们讨厌蝙蝠文件。令人讨厌的令人讨厌的蝙蝠文件。但是,如果我们要求DeptA学习一种新的脚本语言(nant,msbuild),他们可能会遇到阻力。
理想情况下,所选择的构建工具可以在不执行任何其他操作的情况下启动操作列表。沿着:
是否可以使用MSBuild执行此操作?恶性?没有我重新学习XSL?
答案 0 :(得分:1)
如果我是你,我实际上会混合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>
对于服务操作,您可以使用MSBuild Extension Pack中的WindowsService任务。你必须在那里填补空白。
当您调用MSDeploy时,您应该使用Exec任务来调用带参数的msdeploy.exe。如果你传递了-whatif,它实际上不会执行操作,只需报告它会做什么。这些将记录到msbuild日志中。因此,如果使用/ fl调用msbuild.exe,则会将这些操作写入文件。我在采用这种方法时遇到的唯一问题是,对于msdeploy.exe,你需要多次使用完整路径(那些没有.. ),这有时候会很棘手,所以要小心这些路径