Ответ 1
Вы должны сообщить MSBuild о своих нескольких целях
Try
<Target Name="Build" DependsOnTargets="T1; T2">
</Target>
Я установил несколько целей в одном файле 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?
Вы должны сообщить MSBuild о своих нескольких целях
Try
<Target Name="Build" DependsOnTargets="T1; T2">
</Target>
MSBuild позволяет определить целевой объект по умолчанию и позволяет определять зависимости между вашими Целями. Если значение по умолчанию не задано, тогда он запускает первый найденный. Используя DefaultTargets, вы можете вызвать несколько:
<Project DefaultTargets="T1;T2">
Цель должна выполнить весь один четко определенный шаг. Например, цель "Очистить" удалит все необходимые файлы и папки, необходимые для очистки проекта. Компиляция будет компилировать все DLL и т.д.
Ваши цели обычно должны объявлять свои собственные зависимости:
<Target Name="CI" DependsOnTargets="T1, T2">
</Target>
В противном случае ваша цель должна содержать все отдельные шаги, которые вы хотите запустить:
<Target Name="XX">
<CallTarget Targets="T1"/>
<CallTarget Targets="T2"/>
</Target>
MSBuild использует этот порядок, чтобы определить, какие цели должны выполняться. Когда значение найдено, оно останавливается и начинает выполнение.
Как уже отмечал предыдущий комментатор, вы можете использовать список DependsOnTargets, чтобы другие цели выполнялись раньше, чем эта цель.
О вашем решении AfterTargets доступно только в MSBuild 4.0, поэтому он не будет работать с предыдущими версиями.
Сказал Ибрагим Хашими
Моя книга: Внутри Microsoft Build Engine: использование MSBuild и Team Foundation Build
В качестве альтернативы вы можете создать группу свойств, которая определяет все зависимые объекты:
<PropertyGroup>
<BuildDependsOn>T1;T2</BuildDependsOn>
</PropertyGroup>
И затем передайте значение BuildDependsOn в качестве параметра, как показано ниже:
<Target Name="Build" DependsOnTargets="@(BuildDependsOn)"/>
Этот подход позволяет изменять видоизмененный список вне этого файла проекта, чтобы ввести другие требуемые шаги. Для получения дополнительной информации см. Этот сайт.