Как вызвать одну и ту же цель msbuild дважды? - PullRequest
10 голосов
/ 26 августа 2009

У меня есть следующий скрипт msbuild:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         DefaultTargets="All">

  <PropertyGroup>
  ...
  </PropertyGroup>

  <UsingTask AssemblyFile="$(GallioTaskPath)" TaskName="Gallio.MSBuildTasks.Gallio" />
  <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />

  <ItemGroup>
  ...
  </ItemGroup>

  <Target Name="CheckServerHostsItemGroup"
          Condition="'$(NoServerHosts)' != True">
  ...
  </Target>

  <Target Name="RunServerHosts" DependsOnTargets="CheckServerHostsItemGroup"
          Condition="'$(NoServerHosts)' != True">
  ...
  </Target>

  <Target Name="KillServerHosts" DependsOnTargets="CheckServerHostsItemGroup"
          Condition="'$(NoServerHosts)' != True">
    ...
  </Target>

  <Target Name="KillServerHosts2"
          Condition="'$(NoServerHosts)' != True">
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="KillServerHosts" Properties="Configuration=$(Configuration)" />
  </Target>

  <Target Name="All" DependsOnTargets="Build;RunServerHosts;Test;KillServerHosts2">
    <OnError ExecuteTargets="KillServerHosts2" />
  </Target>

  <Target Name="Test">
    ...
    <Error Text="Tests execution failed with exit code $(ExitCode)" Condition="'$(ExitCode)' != 0" />
  </Target>

  <Target Name="CheckSolutionsItemGroup">
  ...
  </Target>

  <Target Name="Build" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts">
  ...
  </Target>

  <Target Name="Clean" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts">
  ...
  </Target>

</Project>

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

В любом случае, как можно видеть, есть одна цель - KillServerHosts, которую я хочу вызвать дважды и по уважительной причине. Один раз перед сборкой, чтобы убедиться, что сборки не заблокированы, а второй раз после завершения тестов для «очистки таблицы».

Естественно, попытка дважды вызвать цель KillServerHosts не работает, MSBuild отказывается создавать одну и ту же цель дважды. Итак, я пытаюсь обмануть, вызвав цель KillServerHosts2. Проблема в том, что иногда это работает, а иногда нет.

Если я запускаю цель KillServerHosts из командной строки, она всегда убивает соответствующие хосты сервера, поэтому в этом отношении она отлично работает.

Есть идеи?

1 Ответ

23 голосов
/ 28 августа 2009

По заданию цели MSBuild выполняются не более одного раза. Вы не должны думать о цели MSBuild как о методе или функции, потому что MSBuild не является функциональным языком программирования.

Если вы хотите выполнить цель более одного раза, вы можете использовать для этого задачу MSBuild, просто передайте другой набор свойств. Например что-то вроде этого

<Target Name="SomeTarget">
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=one" />
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=two" />
</Target>

Примечание. На самом деле я не пробовал это сделать, поэтому могут возникнуть проблемы с синтаксисом, если я неправильно его запомнил или запомнил, но вы должны иметь возможность заставить его работать.

...