【发布时间】:2011-07-01 10:17:41
【问题描述】:
我有一些在 ProjectX 下创建的 TFS 2010 构建定义。现在源代码已移至 ProjectY 下的文件夹。如何将构建定义移动到 ProjectY,以便它们显示在 ProjectY 的团队资源管理器的构建节点下?
【问题讨论】:
标签: tfs tfsbuild build-definition
我有一些在 ProjectX 下创建的 TFS 2010 构建定义。现在源代码已移至 ProjectY 下的文件夹。如何将构建定义移动到 ProjectY,以便它们显示在 ProjectY 的团队资源管理器的构建节点下?
【问题讨论】:
标签: tfs tfsbuild build-definition
我认为没有现成的东西可以将构建定义从一个项目复制到另一个项目。但是,您应该能够使用 TFS API 来做到这一点。您需要将 Pete 所指的构建过程模板移动到新项目的构建过程模板文件夹中。之后,您将执行以下操作:
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 行以查找特定模板。
【讨论】:
上面 Sean 答案的 powershell 版本
# 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();
}
【讨论】:
在 VS2010 中,TFS Power Tools 可以将构建定义从一个项目移动到另一个项目,如此链接中的第二个答案所示:Is it possible to Export TFS 2010 Build Definitions?,如下所示。
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"
VS2010 的 TFS 电动工具可以从以下位置下载:http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f
【讨论】:
仅移动(不复制)一两个构建定义的丑陋但非常有效的方法:
就是这样;)
要确定目标团队项目的 GroupId,只需在 tbl_BuildDefinition 中找到该团队项目的任何 BuildDefinition 并获取其 GroupId。
当然,您接下来需要更新 BuildDefinition 的工作区、要构建的项目,...以使用新团队项目的服务器路径!
如果您在更新 BuildDefinition 时收到“GroupItem 无法跨团队项目移动”之类的错误,则它很可能在更新数据库之前已经打开。关闭并重新打开它。
如果您不打算经常重复此操作,这是 IMO 最快的解决方案。
V.
【讨论】:
构建定义只是 TFS 中的另一个源代码控制文件,您应该能够在 ProjectX 中打开构建定义并将其作为新文件保存到 projectY 的构建定义文件夹中。
编辑
在上面的帖子中,我假设 ProjectX 和 ProjectY 是 TFS 项目,在这种情况下,它们的工作流构建定义只是在它们各自源代码控制根目录的 builddfiniitions 文件夹中。
【讨论】:
Sean 的回答帮助了我,但就我而言,我的构建模板和自定义活动程序集只有一个存储库。所以我不需要编辑设置,我只想将一个构建定义从 TFS 项目 A 复制到 TFS 项目 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();
}
【讨论】: