Когда мы должны вызывать цель, используя 'DependsOnTargets' и <CallTarget>? - PullRequest
28 голосов
/ 12 мая 2010

Насколько я знаю, на данный момент мы можем вызывать другие цели изнутри цели, используя атрибут DependsOnTargets или задачу <CallTarget ...>

У меня вопрос, когда мы должны использовать каждый случай?

Ответы [ 2 ]

54 голосов
/ 12 мая 2010

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>
0 голосов
/ 12 мая 2010

Критическим отличием является то, что цель, указанная в DependsOnTarget , не будет выполнена, если она уже была выполнена ранее . Таким образом, несколько целей могут иметь одинаковую зависимость, но только первая цель будет запускать ее выполнение ( см. Документацию MSDN ).

Вы можете думать об этом как о «Убедитесь, что эта цель уже выполнена, и выполните ее, если она не выполнила».

CallTarget просто выполнит указанную цель независимо от того, выполнялась она ранее или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...