TFSBuild.proj и импорт внешних целей - PullRequest
7 голосов
/ 19 сентября 2008

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

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

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

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

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

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

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

Ответы [ 3 ]

16 голосов
/ 19 сентября 2008

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" />

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

Удачи,

Martin.

1 голос
/ 19 сентября 2008

Если цели следует запускать только тогда, когда 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')" />

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

0 голосов
/ 19 сентября 2008

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

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

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

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

...