Как дважды вызвать одну и ту же цель msbuild?

У меня есть следующий скрипт 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 из командной строки, она всегда убивает соответствующие хосты сервера, поэтому в этом отношении она работает нормально.

Любые идеи?


person mark    schedule 26.08.2009    source источник


Ответы (1)


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

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

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

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

person Sayed Ibrahim Hashimi    schedule 28.08.2009
comment
Атрибут должен быть «Проекты», а не «Проект». Таким образом, ваше предложение работает отлично, спасибо! - person Sergii Volchkov; 28.12.2010