Порядок выполнения задач AfterBuild в проектах Visual Studio ...?
Я определил несколько AfterBuild-задач в своем проекте Visual Studio с различными условиями:
<Target Name="AfterBuild" Condition="'$(Configuration)'=='FinalBuilder'">
<Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" />
</Target>
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" />
</Target>
Но только последний выполняется, если условие совпадает. Если я выбираю FinalBuilder-Configuration, то задачи AfterBuild игнорируются и не выполняются. Если я изменю порядок целевых объектов в файлах проекта (условие="'$(Configuration)'=='FinalBuilder'" в качестве последнего), то AfterBuild для FinalBuilder-Configuration будет выполнен, а для MvcBuildViews-выполнен. игнорируемый.
Важен ли порядок цели? Учитывается ли только последняя задача AfterBuild? Или как я могу определить различные задачи AfterBuild с различными условиями?
Спасибо
Конрад
2 ответа:
Единственная вторая выполняется, потому что она была переопределена. Смотрите раздел MSDN (объявление целевых объектов в главе файл проекта).
В файле проекта следует использовать только один объект AfterBuild, например:
<Target Name="AfterBuild" > <Message Condition="'$(MvcBuildViews)'=='true'" Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> <Message Condition="'$(Configuration)'=='FinalBuilder'" Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> </Target>
Править: Или использовать CallTarget task:
<Target Name="AfterBuild" > <CallTarget Condition="'$(MvcBuildViews)'=='true'" Targets="MvcBuildTarget" /> <CallTarget Condition="'$(Configuration)'=='FinalBuilder'" Targets="FinalBuilderTarget" /> </Target> <Target Name="MvcBuildTarget"> <Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" /> </Target> <Target Name="FinalBuilderTarget" > <Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" /> </Target>
Если вам действительно нужно выполнить несколько задач AfterBuild (это может быть, например, если вам нужны разные наборы входных и выходных данных для каждой задачи), вы можете использовать DependsOnTarget, чтобы просто сделать AfterBuild зависимым от всех из них:
<Target Name="AfterBuild1" Inputs="stuff" Outputs="stuff"> <Message Text="Running first after build task." Importance="high" /> <Exec Command="stuff" /> </Target> <Target Name="AfterBuild2" Inputs="other stuff" Outputs="other stuff"> <Message Text="Running other after build task." Importance="high" /> <Exec Command="stuff" /> </Target> <Target Name="AfterBuild" DependsOnTargets="AfterBuild1;AfterBuild2" />
Если вам нужно ограничить их порядок, просто сделайте AfterBuild2 зависимым от AfterBuild1 с помощью
DependsOnTargets="AfterBuild1"
.