Порядок задач AfterBuild в проектах Visual Studio...?
Я определил несколько AfterBuild - Tasks в моем проекте 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 будут проигнорированы и не будут выполнены. Если я изменяю порядок целевых объектов в файлах проекта (Condition = "'$ (Configuration)' == 'FinalBuilder'" как последний), выполняется AfterBuild для FinalBuilder-Configuration, но для MvcBuildViews игнорируется.
Является ли порядок назначения важным? Учитывается ли только последняя задача AfterBuild? Или как я могу определить различные задачи AfterBuild с разными Условиями?
Спасибо
Конрад
Ответы
Ответ 1
Выполняется только второй, потому что он был переопределен. См. 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>
EDIT:
Или используйте задачу CallTarget:
<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>
Ответ 2
Если вам действительно нужно запустить несколько задач 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"
.