MSBuild условный Exec?

Я строю различные проекты с использованием разметки

Я замечаю, что проект создается только по мере необходимости, и при запуске сценария сборки получается следующий вывод: "Пропуск цели"CoreCompile", потому что все выходные файлы обновлены". Это замечательно, но как мне заставить мои команды

Обновление: я реализовал предложение gregmac, но он все равно выполняет команду независимо. Вот что я получил сейчас:

<Target Name="Name">
<MSBuild Projects="">
    <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
<Exec Command="" Condition="'@(AssembliesBuiltByChildProjects)'!=''" />

Любая дальнейшая помощь очень ценится. Это немного камнем преткновения для меня.

Спасибо за любые советы.

Алан

4 ответа

Решение

Мне удалось найти решение, отвечающее моим потребностям, хотя это может быть не оптимальным решением.

Смотрите мой ответ на мой другой вопрос здесь: MSBuild Post-Build

Спасибо алан

Вы должны быть в состоянии использовать параметр TargetOutputs:

<MSBuild Projects="" >
   <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug -->
<Exec Command="" Condition="'@(AssembliesBuiltByChildProjects)'!=''" />

Если вы можете добавить следующее к каждому из ваших проектов:

<Target Name="DoStuffWithNewlyCompiledAssembly">
    <Exec Command="" />
</Target>

... тогда вам нужно только добавить свойство:

<Target Name="Name">
  <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" />
</Target>

Это работает, потому что кто-то умный в Microsoft добавил следующую строку в конце CoreCompile цель в Microsoft.[CSharp|VisualBasic][.Core].targets (имя файла зависит от языка и версии MSBuild/Visual Studio).

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

Так что, если вы укажете имя цели в TargetsTriggeredByCompilation свойство, ваша цель будет работать, если CoreCompile работает - и ваша цель не будет работать, если CoreCompile пропускается (например, потому что выходная сборка уже обновлена ​​по отношению к коду).

Вы задаете неправильный вопрос.

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

      <Target Name="Name" Condition="@(AssembliesBuiltByChildProjects)'!=''">
    <MSBuild Projects="">
        <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
    </MSBuild>
    <Exec Command=""/>
  </Target>

<Target Name="Name" Condition="@(AssembliesBuiltByChildProjects)'==''">
    ...
</Target>
Другие вопросы по тегам