Если бы я был тобой, я бы на самом деле смешал 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 с вашими параметрами. Если вы передадите -whatif, он на самом деле не будет выполнять действия, просто сообщите, что он сделал бы. Они будут записаны в журнал msbuild. Поэтому, если вы запустите msbuild.exe с / fl, вы получите записанные действия в файл. Единственная проблема, с которой я столкнулся при использовании этого подхода, заключается в том, что для msdeploy.exe вам много раз приходилось использовать полные пути ( без. ), которые иногда могут быть хитрыми, поэтому опасайтесь таких путей.