Проверьте мой ответ здесь: Модульная TeamBuilds
Вы можете сохранить основные функциональные возможности в виде общего файла MSBuild, который включен во все сборки. Кроме того, все эти файлы являются частью вашей более широкой структуры ветвей, поэтому они принимают непосредственное участие в вашем существующем SDLC без какой-либо дополнительной работы. Таким образом:
- Если вы вносите рискованные изменения в свои сценарии сборки, сделайте их в "dev" или "private" ветке, так же, как и при любых других рискованных изменениях.
- Если вам нужно определение сборки, предназначенное только для быстрой проверки, задайте для таких свойств, как SkipLabel, SkipWorkItemCreation и т. Д. Значение False, в файле * .targets, импортированном этим определением сборки.
Чтобы немного расширить # 2, давайте возьмем ваш пример сборок «production» против «test». Вам нужно только включить функции, такие как маркировка, в производственных сборках. Поэтому вы должны удалить свойство SkipLabel из TFSBuild.proj (а также TFSBuild.Common.targets, если оно там определено) и вместо этого установить его в TFSBuild.Production.targets и TFSBuild.Test.targets - конечно, используя два разных значения.
Как упоминалось в предыдущем вопросе, TFSBuild.proj - это основной файл msbuild, который управляет работой остальной части сборки. Вот как выглядит моя шахта:
<?xml version="1.0" encoding="utf-8"?>
<!-- DO NOT EDIT the project element - the ToolsVersion specified here does not prevent the solutions
and projects in the SolutionToBuild item group from targeting other versions of the .NET framework.
-->
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<!-- Import configuration for all MyCompany team builds -->
<Import Project="MyCompany.TeamBuild.Common.targets"/>
<!-- Import build-specific configurations -->
<Import Condition="'$(BuildDefinition)'=='Dev - quick'" Project="MyCompany.TeamBuild.Quick.targets" />
<Import Condition="'$(BuildDefinition)'=='Main - full'" Project="MyCompany.TeamBuild.Full.targets" />
<Import Condition="'$(BuildDefinition)'=='Main - quick'" Project="MyCompany.TeamBuild.Quick.targets" />
<Import Condition="'$(BuildDefinition)'=='Release - full'" Project="MyCompany.TeamBuild.Full.targets" />
<!-- This would be much cleaner as we add more branches, but msbuild doesn't support it :(
Imports are evaluated declaratively at parse-time, before any tasks execute
<Target Name="BeforeEndToEndIteration">
<RegexReplace Input="$(BuildDefinition)" Expression=".*\s-\s" Replacement="">
<Output TaskParameter="Output" PropertyName="BuildType" />
</RegexReplace>
</Target>
<Import Condition="$(BuildType)==full" Project="MyCompany.TeamBuild.Full.targets" />
<Import Condition="$(BuildType)==quick" Project="MyCompany.TeamBuild.Quick.targets" />
-->
</Project>
Делая что-то похожее, вы можете убедиться, что все сборки из ветви Dev являются "быстрыми" сборками (что для вас означает отсутствие маркировки и т. Д.), Все сборки из ветви Release являются "полными" сборками и сборками из Основная ветвь может быть в зависимости от того, какое определение сборки пользователь запускает из Visual Studio / TSWA. У меня есть "быстрые" сборки, настроенные с помощью непрерывной интеграции, и "полные" сборки, работающие по ночам.