2010-10-18 2 views
1

Я строй различных проектов с использованием < MSBuild Projects =»... разметка. Я затем выполняю некоторые инструменты командной строки, после того, как проект будет построен.MSBuild условный Exec?

Например

<Target Name="Name"> 
    <MSBuild Projects="" /> 
    <Exec Command="" /> 
</Target> 

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

Обновление: Я внедрил предложение gregmac, но все равно выполняю команду. Это то, что я получил в настоящее время:

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

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

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

Алан

ответ

0

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

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

Спасибо, Alan

0

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

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

Привет, Спасибо за ваше предложение и извините за задержку в ответе. Я просто собираюсь попробовать это сейчас. Я пробовал, но все еще выполнял команду независимо от того, был ли проект построен. См. Мой обновленный вопрос. Есть идеи? –

+0

Изучив это далее, я вижу, что AssembliesBuiltByChildProjects содержит имя моей сборки. Однако нет никакой разницы в этом значении, строится ли проект или нет ... Это немного разочаровывает, потому что это так близко. Может ли кто-нибудь пролить свет? –

0

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

<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 runs-- и ваша цель не будет работать, если CoreCompile пропускается (например, потому что выход сборка уже вверх-to дата относительно кода).

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