У меня есть некоторые определения сборки TFS 2010, которые были созданы в ProjectX. Теперь исходный код переместился в папку, подчиненную ProjectY. Как перенести определения сборки в ProjectY, чтобы они отображались в разделе Builds node Team Explorer для ProjectY?
Как перенести определение сборки TFS 2010 между проектами?
Ответ 1
Я не думаю, что есть что-то из коробки, чтобы скопировать определения сборки из одного проекта в другой. Однако вы должны это сделать, используя TFS API. Вам нужно будет переместить шаблоны процесса сборки, к которым относится Пит, в папку "Шаблон процесса сборки" для нового проекта. После этого вы сделаете что-то вроде:
var server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("<server uri>"));
IBuildServer buildServer = server.GetService<IBuildServer>();
var buildDetails = buildServer.QueryBuildDefinitions("Project X");
foreach(var build in buildDetails)
{
var buildDefinition = buildServer.CreateBuildDefinition("Project Y");
buildDefinition.Name = "Copy of " + build.Name;
buildDefinition.BuildController = build.BuildController;
// This finds the template to use
buildDefinition.Process = buildServer.QueryProcessTemplates("Project Y")[0];
buildDefinition.ProcessParameters = build.ProcessParameters;
buildDefinition.Save();
}
Несколько замечаний. Вам нужно будет иметь дело с преобразованием сопоставлений рабочего пространства из одного проекта в другой. Вам также потребуется изменить строку buildDefinition.Process, чтобы найти конкретный шаблон.
Ответ 2
Вариант Шейна с командной оболочкой выше
# Copy some TFS build defintions from one project collection to another
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client")
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client")
$tfsUrl = "http://lontfs_at:8080/tfs/XXX"
$tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsUrl)
$vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
$buildServer = $tfs.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])
$buildDetails = $buildServer.QueryBuildDefinitions("Project X");
foreach( $build in $buildDetails)
{
$buildDefinition = $buildServer.CreateBuildDefinition("Project Y");
$buildDefinition.Name = "Copy of " + $build.Name;
$buildDefinition.BuildController = $build.BuildController;
# This finds the template to use
$buildDefinition.Process = $buildServer.QueryProcessTemplates("Project Y")[0];
$buildDefinition.ProcessParameters = $build.ProcessParameters;
$buildDefinition.Save();
}
Ответ 3
В VS2010 инструменты TFS Power Tools могут перемещать определение сборки из одного проекта в другой, как показано в 2-м ответе по этой ссылке: Возможно ли экспортировать определения сборки TFS 2010? и, как показано ниже.
c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>tfpt
builddefinition /collection:"http://ServerX:8080/tfs/Collection X" /clone "Project 1\Build
Definition X" "Project 2\Copy of Build Definition X"
Электроинструменты TFS для VS2010 можно загрузить с помощью http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f
Ответ 4
Ужасно, но очень эффективный способ переместить (не дублировать) только один или два определения сборки:
- Откройте SQL Server Management Studio,
- Откройте свою коллекцию DB
- Изменить таблицу tbl_BuildDefinition
- Заменить текущий GroupId целевой Team Group GroupId
Что это;)
Чтобы определить GroupId целевого Team Project, просто найдите любое BuildDefinition этого Team Project в tbl_BuildDefinition и возьмите его GroupId.
Конечно, у вас есть рядом, чтобы обновить рабочее пространство BuildDefinition, Items to build,... использовать путь к серверу нового Team Project!
Если вы получаете сообщение об ошибке, например, "GroupItem не может перемещаться по Team Project" при обновлении BuildDefinition, скорее всего, он был открыт до обновления БД. Закройте и снова откройте его.
Если вы не собираетесь слишком часто повторять эту операцию, это IMO - самое быстрое решение.
V.
Ответ 5
Определения сборки - это всего лишь еще один файл с контролируемым источником в TFS, вы должны иметь возможность открыть определение сборки в ProjectX и сохранить его как новый файл в файле описания конструкций проекта.
Edit
В приведенной выше статье я предполагаю, что ProjectX и ProjectY являются проектами TFS, и в этом случае их определение (их) построения рабочего процесса просто находится в папке builddfinitions их соответствующих корней управления источником.
Ответ 6
Ответ Шона помог мне, но в моем случае у меня есть только один репозиторий для моих шаблонов сборки и сборки пользовательских действий. Поэтому мне не нужно редактировать настройки, я просто хочу скопировать одно определение сборки из проекта A TFS в проект TFS Project B. Вот моя "короткая" версия кода Шона:
var server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("TFS URL"));
IBuildServer buildServer = server.GetService<IBuildServer>();
var buildDetails = buildServer.QueryBuildDefinitions("Proj_A");
foreach(var build in buildDetails)
{
var buildDefinition = buildServer.CreateBuildDefinition("Proj_B");
buildDefinition.CopyFrom(build);
buildDefinition.Save();
}