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>