Ответ 1
MSBuild предоставляет различные способы вызова цели:
- Задача MSBuild
- Задача CallTarget
- Целевой атрибут DependsOnTarget
- Атрибуты цели BeforeTargets и AfterTargets в MSBuild 4
Использование CallTarget
- явный подход, вы начинаете со своей первой цели и явно вызываете каждую цель в CallTarget
вам порядке.
В то время как DependsOnTargets
является неявным подходом, MSBuild определяет порядок вызова, проверяя зависимость целей.
Между CallTarget
и DependsOnTargets
нет разницы в количестве времени, в течение которого цель может выполняться: цель никогда не будет запускаться дважды в течение одной сборки (кроме случаев, когда вы используете задачу MSBuild с другим свойством)
Ограничение CallTarget
Одно ограничение CallTarget
связано с динамическими элементами и свойством: вы не можете получить доступ к элементу или свойству, которые вы создали в цели в другой цели, которая называется CallTarget:
<Target Name="Caller">
<CreateProperty Value="MyValue">
<OutputTaskParameter="Value" PropertyName="NewProperty"/>
</CreateProperty>
<CallTarget Targets="Called"/>
</Target>
<Target Name="Called">
<Message Text="$(NewProperty)"/>
</Target>
Динамические свойства не публикуются до тех пор, пока цель, создавшая их, не будет выполнена. У вас нет этой проблемы с использованием DependsOnTarget
Что я должен использовать?
Вы должны использовать DependsOnTargets
для целей, которые должны быть выполнены перед вашей целью. И CallTarget
для цели, чтобы выполнить после вашей цели. Вот так Microsoft делает это.
<Target Name="CoreCompile"
DependsOnTargets="$(CoreCompileDependsOn)">
<!-- Target execution -->
<Csc ... />
...
<!-- Targets to execute after -->
<CallTarget Targets="$(TargetsTriggeredByCompilation)"/>
</Target>