2009-08-26 3 views
9

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

Любые идеи?

ответ

22

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

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

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

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

+0

Атрибут должен быть «Проекты», а не «Проект». Таким образом, ваше предложение работает отлично, спасибо! –

+0

Я только что исправил это. –

Смежные вопросы