MSBuild предоставляет различные способы вызова цели:
Использование 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>