如何在新的TeamFoundation 2013模板中获取Workspace对象

在新版本的TeamFoundation 2013默认构建模板中,缺少Workspace变量。 对于像ConvertWorkspaceItem这样的关键活动,它需要作为intput参数。 如何获取TfvcTemplate.12.xaml模板的当前工作空间? 我试过使用这个msdn线程,但它不适合我(返回null工作区名称)。 有什么建议?

2013年有一项名为GetLocalPath的新活动取代了ConvertWorkspaceItem。 该活动位于Microsoft.TeamFoundation.Build.Activities程序集中的Microsoft.TeamFoundation.Build.Activities命名空间下。

它使用LocalPathProvider类来聚合构建中使用的所有工作空间,并在一个位置公开所有工作空间的路径转换。 这基本上消除了知道工作空间的依赖性,以便将服务器路径转换为本地路径,并允许您根据需要使用任意数量的工作空间,而不必担心会破坏某些内容。

当MS取走某些东西时,通常是有充分理由的。 “黑客”真的没必要。

我使用Microsoft.TeamFoundation.Build.Activities.dll (由microsoft用于创建工作区名称)的内部类进行了黑客攻击。 您需要使用以下代码创建自定义活动:

 public sealed class GetDefaultWorkspace : BaseActivity { public override Activity CreateBody() { var type = typeof(TfGetSources).Assembly.GetType("Microsoft.TeamFoundation.Build.Activities.TeamFoundation.TfGetSources+GetDefaultWorkspaceName"); var activity = (CodeActivity)Activator.CreateInstance(type); var sequence = new Sequence(); var workspaceName = new Variable(); sequence.Variables.Add(workspaceName); sequence.Activities.Add(activity); activity.Result = (OutArgument) workspaceName; sequence.Activities.Add(new GetWorkspace { Name = workspaceName, Result = new LambdaReference(ctx => Result.Get(ctx)) }); return sequence; } } 

对于某些人来说,这个答案可能会更好。 ghord的答案很有效,并将Workspace传回可以在XAML中使用的位置。 但是,出于我的目的,我只想在我的自定义TFS活动中使用工作区,所以我最终得到了这个替代方案……

 public sealed class CustomActivity : CodeActivity { protected override void Execute(CodeActivityContext context) { // get workspace var buildDetail = context.GetExtension(); var buildAgent = context.GetExtension(); var buildDirectory = buildAgent.GetExpandedBuildDirectory(buildDetail.BuildDefinition); var workspacePath = Path.Combine(buildDirectory, "src"); var wsInfo = Workstation.Current.GetLocalWorkspaceInfo(workspacePath); var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(wsInfo.ServerUri); tfs.Connect(ConnectOptions.None); var vcs = tfs.GetService(); // finally can get to the workspace here var workspace = vcs.GetWorkspace(workspacePath); } } 

使用此方法,我不必拥有仅返回工作空间的活动,然后必须将工作空间传递到其他TFS活动。 我只是在运行时从我自己的活动中获取工作区。

我相信这里采用的方法将使用已下载的工作区。 请记住,此方法仅在“初始化环境”之后的“在代理上运行”序列的范围内以及在Try Compile,Test,Publish的finally语句中的ResetEnvironment之前工作。 否则,工作流将不知道源目录。

http://social.msdn.microsoft.com/Forums/vstudio/en-US/420ba073-bdf5-4ab4-88da-c84561d1a1ba/creating-dynamic-working-folder-in-tfs2013-defaulttemplate?forum=tfsbuild