TFSBuild.proj и импорт внешних целей
Мы хотим сохранить наши переопределенные цели сборки во внешнем файле и включить этот файл целей в TFSBuild.proj. У нас есть базовые шаги, которые выполняются, и мы хотели бы получить эти дополнительные шаги, просто добавив строку импорта в TFSBuild.proj, созданный мастером.
<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>
Мы не можем импортировать файлы в $(SolutionRoot)
потому что во время проверки оператора импорта источник не был извлечен из хранилища. Похоже, TFS тянет вниз TFSBuild.proj
сначала без каких-либо других файлов.
Даже если мы добавим условный импорт, версия в системе контроля версий не будет импортирована, если она присутствует. Предыдущая версия, уже имеющаяся на диске, будет импортирована.
Мы можем отказаться от хранения этих целей сборки с нашим источником, но это первая зависимость, которая выходит за пределы нашего исходного дерева, поэтому мы не хотим этого делать.
Есть ли способ либо:
- Скажите Team Build, чтобы он раскрыл еще несколько файлов, чтобы те
Import
высказывания оценивают правильно? - Отменить те цели Team Build, как
AfterCompile
таким образом, кромеImport
? - В конечном счете запустить цели сборки в 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 нет повторяющихся переопределений, иначе импортированные переопределения не будут запущены.