我有一些在ProjectX下创建的TFS 2010构建定义。现在源代码已移至从属于ProjectY的文件夹。如何将构建定义移动到ProjectY,以便它们显示在ProjectY的Team Explorer的Builds节点下?
答案 0 :(得分:12)
我认为没有开箱即可将构建定义从一个项目复制到另一个项目。但是,您应该能够使用TFS API执行此操作。您需要将构建过程模板(Pete所指的)移动到新项目的Build Process Template文件夹中。之后你会做类似的事情:
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行以查找特定模板。
答案 1 :(得分:6)
肖恩上面回答的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();
}
答案 2 :(得分:5)
在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 Power Tools:http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f
答案 3 :(得分:4)
Uggly但非常有效的方式移动(不重复)只有一个或两个构建定义:
就是这样;)
要确定目标团队项目的GroupId,只需在tbl_BuildDefinition中找到该团队项目的任何BuildDefinition并获取其GroupId。
当然,您接下来要更新BuildDefinition的工作区,要构建的项目,......以使用新Team Project的服务器路径!
如果在更新BuildDefinition时遇到类似“GroupItem无法跨团队项目移动”的错误,则在更新数据库之前很可能已经打开了。关闭并重新打开它。
如果您不打算经常重复此操作,那么IMO是最快的解决方案。
诉P>
答案 4 :(得分:1)
构建定义只是TFS中的另一个源控制文件,您应该能够在ProjectX中打开构建定义并将其作为新文件保存到projectY的构建定义文件夹中。
修改强>
在上面的帖子中我假设ProjectX和ProjectY是TFS项目,在这种情况下,他们的工作流构建定义只是在各自源代码控制根的builddfinitions文件夹中。
答案 5 :(得分:1)
Sean的回答帮助了我,但就我而言,我只有一个存储库用于构建模板和自定义活动程序集。所以我不需要编辑设置,我只想将一个构建定义从TFS项目A复制到TFS项目B. 这是Sean代码的“简短”版本:
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();
}