Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在项目之间移动TFS 2010生成定义?_Tfs_Tfsbuild_Build Definition - Fatal编程技术网

如何在项目之间移动TFS 2010生成定义?

如何在项目之间移动TFS 2010生成定义?,tfs,tfsbuild,build-definition,Tfs,Tfsbuild,Build Definition,我有一些TFS2010构建定义是在ProjectX下创建的。现在,源代码已移动到ProjectY的下属文件夹中。如何将生成定义移动到ProjectY,使其显示在ProjectY团队资源管理器的“生成”节点下?生成定义只是TFS中的另一个受源代码控制的文件,您应该能够在ProjectX中打开生成定义,并将其作为新文件保存到ProjectY的“生成定义”文件夹中 编辑 在上面的帖子中,我假设ProjectX和ProjectY是TFS项目,在这种情况下,它们的工作流构建定义只存在于各自源代码管理根目录

我有一些TFS2010构建定义是在ProjectX下创建的。现在,源代码已移动到ProjectY的下属文件夹中。如何将生成定义移动到ProjectY,使其显示在ProjectY团队资源管理器的“生成”节点下?

生成定义只是TFS中的另一个受源代码控制的文件,您应该能够在ProjectX中打开生成定义,并将其作为新文件保存到ProjectY的“生成定义”文件夹中

编辑

在上面的帖子中,我假设ProjectX和ProjectY是TFS项目,在这种情况下,它们的工作流构建定义只存在于各自源代码管理根目录的builddInitiations文件夹中。

我不认为有什么现成的东西可以将构建定义从一个项目复制到另一个项目。但是,您应该能够使用TFSAPI来实现这一点。您需要将生成过程模板(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();                
}
var server=tfstreamprojectcollectionfactory.GetTeamProjectCollection(新Uri(“”);
IBuildServer buildServer=server.GetService();
var buildDetails=buildServer.QueryBuildDefinitions(“项目X”);
foreach(var内置buildDetails)
{
var buildDefinition=buildServer.CreateBuildDefinition(“项目Y”);
buildDefinition.Name=“副本”+build.Name;
buildDefinition.BuildController=build.BuildController;
//这将查找要使用的模板
buildDefinition.Process=buildServer.QueryProcessTemplates(“项目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();                
}

只移动一个或两个构建定义,这是一种非常糟糕但非常有效的方法(不要重复):

  • 打开SQL Server Management Studio
  • 打开你的收藏数据库
  • 编辑表tbl_BuildDefinition
  • 用目标团队项目的GroupId替换当前GroupId
就这样;)

要确定目标团队项目的GroupId,只需在tbl_BuildDefinition中找到该团队项目的任何BuildDefinition并获取其GroupId

当然,接下来要更新BuildDefinition的工作区、要生成的项。。。使用新团队项目的服务器路径

如果在更新BuildDefinition时出现类似“GroupItem无法移动accross团队项目”的错误,则它很可能在更新DB之前已打开。关闭并重新打开它

如果您不打算太频繁地重复此操作,这是最快的解决方案


V.

肖恩的回答帮助了我,但就我而言,我只有一个用于构建模板和自定义活动程序集的存储库。所以我不需要编辑设置,我只想将一个构建定义从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();
}
var server=tfstreamprojectcollectionfactory.GetTeamProjectCollection(新Uri(“TFS URL”);
IBuildServer buildServer=server.GetService();
var buildDetails=buildServer.QueryBuildDefinitions(“Proj_A”);
foreach(var内置buildDetails)
{
var buildDefinition=buildServer.CreateBuildDefinition(“Proj_B”);
buildDefinition.CopyFrom(build);
buildDefinition.Save();
}

在VS2010中,TFS电动工具可以将构建定义从一个项目移动到另一个项目,如本链接第二个答案所示:,如下所示

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 for VS2010可从以下位置下载:

在VS 2010中,情况似乎并非如此,或者——如果是的话——我不知道从何处查找。确实,一些旧的TFS2005构建类型在TFS中随处可见;然而,在ProjectX文件夹或其子文件夹中找不到2010年构建的最新构建定义。啊,我认为TFS项目和VisualStudio项目之间有点混淆。在TFS2010中,构建定义是$BuildDefinitions文件夹中的工作流(这来自内存;我在家,这里没有TFS),因此所有VS 2010项目的TFS构建服务器的所有构建定义都位于该TFS项目文件夹中。太棒了-它移动了构建定义,因此保留了所有构建历史,这对我很有效。只需在移到源代码管理文件夹和项目位置后进行更新。