Почему MSBuild не выполняет несколько целей? - PullRequest
16 голосов
/ 11 июля 2009

Я установил несколько целей в одном файле XML. Я ожидаю, что все цели будут выполнены, но будет выполнена только первая цель.

Вот упрощенная версия того, что я пытаюсь сделать:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="T1">
    <Copy SourceFiles="c:\temp\a.txt" DestinationFolder="C:\temp2\" />    
  </Target>
  <Target Name="T2">
    <Copy SourceFiles="c:\temp\b.txt" DestinationFolder="C:\temp2\" />    
  </Target>
</Project>

Я запускаю сборку с сервера TeamCity CI, и в отчетах регистрируется код завершения процесса: 0.

У кого-нибудь есть идеи, почему он не запускает T2?

Ответы [ 4 ]

29 голосов
/ 11 июля 2009

Вам нужно сообщить MSBuild о ваших многочисленных целях

Попробуйте

<Target Name="Build" DependsOnTargets="T1; T2">
</Target>
18 голосов
/ 11 июля 2009

MSBuild позволяет вам определять цель по умолчанию и определять зависимости между вашими целями. Если значение по умолчанию не определено, выполняется первый найденный файл. Используя DefaultTargets, вы можете вызвать несколько:

<Project DefaultTargets="T1;T2">

Цель должна выполнить все четко определенные шаги. Например, цель Clean удалит все необходимые файлы и папки, необходимые для очистки проекта. Компиляция будет компилировать все библиотеки DLL и т. Д.

Ваши цели обычно должны объявлять свои собственные зависимости:

<Target Name="CI" DependsOnTargets="T1, T2">
</Target>

В противном случае ваша цель должна содержать все отдельные шаги, которые вы хотите выполнить:

<Target Name="XX">
    <CallTarget Targets="T1"/>
    <CallTarget Targets="T2"/>
</Target>
2 голосов
/ 13 июля 2009

MSBuild использует этот порядок, чтобы определить, какие цели должны быть выполнены. Как только значение найдено, оно останавливается и начинает выполнение.

  • Целевые объекты, которые вы указываете с помощью ключа / t на msbuild.exe
  • Цели, содержащиеся в атрибуте DefaultTargets элемента Project
  • Первая цель, найденная в скрипте сборки ( немного более сложная на самом деле )

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

О вашем решении AfterTargets доступно только в MSBuild 4.0, поэтому не будет работать с предыдущими версиями.

Сайед Ибрагим Хашими

Моя книга: Внутри Microsoft Build Engine: использование MSBuild и Team Foundation Build

0 голосов
/ 26 мая 2011

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

 <PropertyGroup>
        <BuildDependsOn>T1;T2</BuildDependsOn>
 </PropertyGroup>

И затем передайте значение BuildDependsOn в качестве параметра, как показано ниже:

<Target Name="Build" DependsOnTargets="@(BuildDependsOn)"/>

Этот подход позволяет изменять список зависимостей вне этого файла проекта, чтобы вводить другие необходимые шаги. См. сайт для получения дополнительной информации.

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