Как переместить определение сборки TFS 2010 между проектами? - PullRequest
11 голосов
/ 21 февраля 2011

У меня есть несколько определений сборки TFS 2010, которые были созданы в ProjectX. Теперь исходный код перемещен в папку, подчиненную ProjectY. Как я могу переместить определения сборок в ProjectY, чтобы они отображались в узле «Сборки» в Team Explorer для ProjectY?

Ответы [ 6 ]

12 голосов
/ 22 февраля 2011

Я не думаю, что есть что-то из коробки, чтобы скопировать определения сборки из одного проекта в другой.Однако вы должны быть в состоянии сделать это с помощью 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, чтобы найти конкретный шаблон.

6 голосов
/ 02 августа 2012

Версия ответа Шона, приведенная выше,

# 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();                
}
5 голосов
/ 17 января 2014

В 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 Power Tools для VS2010 можно загрузить по адресу: http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f

4 голосов
/ 14 августа 2012

Уродливый, но очень эффективный способ переместить (не дублировать) только одно или два определения сборки:

  • Открыть SQL Server Management Studio,
  • ОткрытьDB вашей коллекции
  • Редактировать таблицу tbl_BuildDefinition
  • Заменить текущий GroupId на GroupId целевого командного проекта

Вот и все;)

Чтобы определитьGroupId целевого командного проекта, просто найдите любое BuildDefinition этого командного проекта в tbl_BuildDefinition и возьмите его GroupId.

Конечно, у вас есть возможность обновить рабочее пространство BuildDefinition, элементы для построения, ... чтобы использоватьсерверный путь нового командного проекта!

Если при обновлении BuildDefinition вы получили сообщение об ошибке «GroupItem нельзя перемещать по командному проекту», скорее всего, оно уже было открыто до обновления базы данных.Закройте и снова откройте его.

Если вы не собираетесь повторять эту операцию слишком часто, это ИМО самое быстрое решение.

V.

1 голос
/ 06 сентября 2013

Ответ Шона помог мне, но в моем случае у меня есть только один репозиторий для моих шаблонов сборки и сборок пользовательских действий. Поэтому мне не нужно редактировать настройки, я просто хочу скопировать одно определение сборки из TFS Project A в 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();
}
1 голос
/ 21 февраля 2011

Определения сборки - это просто еще один исходный контролируемый файл в TFS, вы должны иметь возможность открыть определение сборки в ProjectX и сохранить его как новый файл в папке определений сборки проектаY.

Редактировать
В вышеприведенном посте я предполагаю, что ProjectX и ProjectY являются проектами TFS, и в этом случае их определения сборки рабочего процесса находятся просто в папке builddfinitions их соответствующих корней управления исходным кодом.

...