Почему MSBuild не выполняет несколько целей?

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

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

<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?

Ответы

Ответ 1

Вы должны сообщить MSBuild о своих нескольких целях

Try

<Target Name="Build" DependsOnTargets="T1; T2">
</Target>

Ответ 2

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

<Project DefaultTargets="T1;T2">

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

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

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

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

<Target Name="XX">
    <CallTarget Targets="T1"/>
    <CallTarget Targets="T2"/>
</Target>

Ответ 3

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

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

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

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

Сказал Ибрагим Хашими

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

Ответ 4

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

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

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

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

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