TFSBuild.proj и импорт внешних целей

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

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>

Мы не можем импортировать файлы в $(SolutionRoot) потому что во время проверки оператора импорта источник не был извлечен из хранилища. Похоже, TFS тянет вниз TFSBuild.proj сначала без каких-либо других файлов.

Даже если мы добавим условный импорт, версия в системе контроля версий не будет импортирована, если она присутствует. Предыдущая версия, уже имеющаяся на диске, будет импортирована.

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

Есть ли способ либо:

  1. Скажите Team Build, чтобы он раскрыл еще несколько файлов, чтобы те Import высказывания оценивают правильно?
  2. Отменить те цели Team Build, как AfterCompile таким образом, кроме Import?
  3. В конечном счете запустить цели сборки в Team Build, которые находятся под источником, который он пытается собрать?

3 ответа

Решение

Team Build имеет фазу "начальной загрузки", когда все содержимое папки конфигурации Team Build (папка с TFSBuild.proj) загружается из системы управления версиями. Это выполняется агентом сборки перед тем, как агент сборки вызовет MSBuild.exe, чтобы он сказал запустить TFSBuild.proj.

Если вы переместите файл целей из-под SolutionRoot и поместите его в папку конфигурации рядом с файлом TFSBuild.proj, вы сможете импортировать его в файл TFSBuild.proj, используя оператор относительного импорта, т.е.

<Import Project="myTeamBuild.targets"/>

Если эти цели зависят от каких-либо дополнительных пользовательских сборок задач MSBuild, вы также можете разместить их в той же папке, что и ваш файл TFSBuild.proj, и вы можете легко ссылаться на них, используя относительный путь.

Обратите внимание, что в TFS2008 папка конфигурации сборки по умолчанию находится в каталоге $/TeamProject/TeamBuildTypes, однако это не обязательно должно быть там. Он может фактически находиться в папке, которая находится внутри вашего решения - и даже может быть проектом в вашем решении, посвященном Team Build. Это имеет несколько преимуществ, в том числе упрощение ветвления сборки. Поэтому, как правило, моя сборка находится в такой папке:

$/TeamProject/main/MySolution/TeamBuild

Также обратите внимание, что по умолчанию на этапе начальной загрузки сборки агент сборки будет загружать только те файлы, которые находятся в папке конфигурации сборки, и не будет записываться ни в какие подпапки. Если вы хотите, чтобы файлы включались в подпапки на этапе начальной загрузки, вы можете установить следующее свойство в appSettings файла tfsbuildserver.exe.config на машинах агента сборки (находится в%ProgramFiles%\Visual Studio 9.0\Common7\IDE\PrivateAssemblies)

<add key="ConfigurationFolderRecursionType" value="Full" />

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

Удачи,

Мартин.

Если цели следует запускать только тогда, когда TFS выполняет сборку, а не на локальных компьютерах разработки, вы можете поместить файл целей в папку для самой сборки и сослаться на него:

<Import Project="$(MSBuildProjectDirectory)\my.team.build.targets.proj" />

Однако, если вы хотите, чтобы цели выполнялись для всех сборок, вы можете настроить его так, чтобы отдельные проекты ссылались на него, добавив что-то вроде:

<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets" Condition="Exists('$(SolutionRoot)/libs/my.team.build/my.team.build.targets')" />

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

Если вы создаете целевой файл переопределений для импорта и называете его что-то вроде TeamBuildOverrides.targets и помещаете его в ту же папку в управлении исходным кодом, где TFSBuild.proj живет для вашего типа сборки, он будет извлечен первым и будет доступен для импорта в TFSBuild Файл.proj. По умолчанию файл TFSBuild.proj добавляется в папку TeamBuildTypes в Source Control прямо под корневой папкой вашего проекта.

используйте следующую инструкцию импорта в вашем файле TFSBuild.proj:

<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" />

Убедитесь, что в файле TFSBuild.proj нет повторяющихся переопределений, иначе импортированные переопределения не будут запущены.

Другие вопросы по тегам