NANT против MSbuild: остановка службы - PullRequest
4 голосов
/ 04 февраля 2010

Я пытаюсь решить, на чьей стороне я в войне против МсБилд против Нанта.Я начинаю с: остановить службу, развернуть некоторые файлы, перезапустить службу.Просто взглянув на эти две ссылки, это гораздо проще сделать в Nant.

MSBuild: Пример использования задачи MSBuild службы существует в 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>

Интересно, согласится ли со мной Сообщество?Гораздо проще сделать основные вещи, подобные этому, в Нанте?Конечно, выглядит так.C # код в блоке CDATA?WTF?

Наш текущий процесс сборки: а) много файлов с битами б) много ругательств.Я бы очень хотел найти хорошую замену, но эти вещи из MsBuild кажутся мне миром боли.Я думаю, что для этого нужно создать сценарии в Nant, а затем использовать MsBuild для выполнения любых сборок .NET, которые необходимо выполнить.

Один важный вопрос : какой из них лучше при обнаружении ошибок в сценарии перед его выполнением?Я думал о том, чтобы развернуть свои собственные здесь, и это было очень важной частью: выровняйте все свои данные и убедитесь, что они имеют смысл, прежде чем пытаться запустить.

Ответы [ 4 ]

8 голосов
/ 04 февраля 2010

В msbuild вы также можете использовать задачу ServiceController, которая упакована в задачи сообщества msbuild .

7 голосов
/ 04 февраля 2010

Вы можете выполнить sc.exe, используя MSBuild каждый бит так же легко ...

<Exec Command="sc.exe \\server stop shibd_Default" />

По умолчанию это будет «сбой», если код выхода (sc.exe) не равен нулю, но его можно настроить.

4 голосов
/ 05 июля 2010

В Nant есть 2 других способа остановить службу, и один может отследить ошибку.

Первый (с использованием 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 голос
/ 08 марта 2013

В дополнение к @ nulpptr ответу для MSBuild, если у вас нет возможности использовать задачи сообщества, вам, возможно, придется прибегнуть к хаку, чтобы дождаться остановки службы, прежде чем продолжать,Если у вас есть набор ресурсов, вы можете использовать задачу EXEC с командой sleep.

Нет набора ресурсов?Используйте трюк пинга ...

Однако, если у вас нет комплекта ресурсов, вы можете использовать трюк пинга, чтобы вызвать задержку.Например, следующее остановит вашу службу с помощью команды sc, а затем сделает паузу примерно на 5 секунд:

<Exec Command="sc.exe \\server stop shibd_Default" ContinueOnError="true" />
<Exec Command="ping 127.0.0.1 -n 5 > nul" ContinueOnError="true" />
...