11

ProjectX で作成された TFS 2010 ビルド定義がいくつかあります。これで、ソース コードは ProjectY の下位フォルダーに移動しました。ビルド定義を ProjectY に移動して、ProjectY のチーム エクスプローラーの [ビルド] ノードの下に表示するにはどうすればよいですか?

4

6 に答える 6

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 行も変更する必要があります。

于 2011-02-21T21:51:46.627 に答える
6

上記のショーンの答えのパワーシェルバージョン

# 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();                
}
于 2012-08-02T09:13:43.327 に答える
4

1 つまたは 2 つのビルド定義のみを移動する(複製しない)醜いが非常に効率的な方法:

  • SQL Server Management Studio を開きます。
  • コレクション DB を開く
  • テーブル tbl_BuildDefinition を編集します
  • 現在の GroupId をターゲット チーム プロジェクトの GroupId に置き換えます

それでおしまい ;)

ターゲット チーム プロジェクトの GroupId を特定するには、tbl_BuildDefinition でそのチーム プロジェクトの BuildDefinition を検索し、その GroupId を取得します。

確かに、BuildDefinition のワークスペース、ビルドするアイテム、...を更新して、新しいチーム プロジェクトのサーバー パスを使用する必要があります。

BuildDefinition を更新するときに「GroupItem をチーム プロジェクト全体に移動できません」のようなエラーが発生した場合は、DB を更新する前に既に開いていた可能性があります。閉じて、再度開きます。

この操作をあまり頻繁に繰り返すつもりがない場合は、IMO が最速のソリューションです。

V.

于 2012-08-14T09:21:59.360 に答える
1

ビルド定義は、TFS の別のソース管理ファイルにすぎません。ProjectX でビルド定義を開いて、projectY のビルド定義フォルダーに新しいファイルとして保存できるはずです。

編集
上記の投稿では、ProjectX と ProjectY が TFS プロジェクトであると想定しています。この場合、ワークフローのビルド定義は、それぞれのソース管理ルートの builddfinitions フォルダーにあるだけです。

于 2011-02-21T18:23:47.797 に答える