如何解析服务器上 TFS 文件夹的根路径和相对路径?

How do I resolve the root and relative paths of TFS folders on the server?

我创建了一个 CodeActivity 用于(自定义)构建定义。这个 activity 需要复制位于服务器 to/from 位置的文件,如 'source directory'、'custom folders' 到 'drop directory' (等),然后再执行其主要目的。

我的一些变量是有效路径,但其他变量显然是 'relative paths' 的占位符。但是,我需要物理服务器路径,以便来回复制有用的项目。

我需要这样的东西:

当然,我可以将项目名称传递到 activity(用于解析目的)...因为那只是 'cheesy'.

我的问题是:


一些我知道如何获得的东西的例子:
这些物品有些用处,而其他的……没那么有用。除非,我可以使用它们来获取物理服务器路径。

构建目录:
'F:\bld\Builds\Test\Test_CustomActivity_CreateNuGetPackages'

BuildDetail.DropLocationRoot:
'$/Test/Drops'
...希望我有物理路径

BuildDetail.BuildController.CustomAssemblyPath:
'$/Test/BuildProcessTemplates'
...希望我有物理路径

来源目录:
'F:\bld\Builds\Test\Test_CustomActivity_CreateNuGetPackages\src'

Workspace.Folders:
'F:\bld\Builds\Test\Test_CustomActivity_CreateNuGetPackages\src\Test\NuGet.Research\net35'

我想要的一些例子:

更新:2/2/2015
@Edward - 根据您的要求。下面是我想要完成的更详细的解释。

让我在这个回答的开头说有很多术语超载,所以我想定义一些东西:

  • 服务器路径:文件或文件夹在版本控制系统中的路径。例如,$/Test/BuildResources 服务器路径 。这是一个绝对的服务器路径,不是相对的。
  • 本地路径:您将服务器路径映射到您机器上的路径。例如,D:\Test\BuildResources/home/me/test/buildresources 本地路径 .
  • Mapping:服务器路径和本地路径的对应关系——这样当你做一个"get"时,TFVC就知道把文件放在本地机器的什么地方。

我对此的定义不是迂腐,而是因为在使用 TFS SDK 时使用正确的术语会有所帮助,这将使您可以轻松查询给定服务器路径的本地路径(反之亦然)。 (您不应该简单地将路径组件连接在一起,因为 TFVC 允许非常复杂的工作区映射。)

要开始使用TFS SDK,您首先需要找到服务器连接信息。如果您有给定的本地路径(在这种情况下,您的 SourcesDirectory),您可以使用它来读取工作区缓存并获取构建服务器创建的服务器连接所需的信息:

// Get the workspace information for the build server's workspace
var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(sourcesDirectory);

// Get the TFS Team Project Collection information from the workspace cache
// information then load the TFS workspace itself.
var server = new TfsTeamProjectCollection(workspaceInfo.serverUri);
var workspace = workspaceInfo.GetWorkspace(server);

有了工作区后,您可以查询它的路径映射。它将根据您的工作区映射进行从服务器到本地路径的必要转换。例如:

workspace.GetServerItemForLocalItem("D:\My\Local\Path");

workspace.GetLocalItemForServerItem("$/My/Server/Path");

但是,只有当您的构建定义实际设置工作区以包含这些文件时,此机制才会起作用。如果您需要某个目录 $/Foo/Bar,您需要确保它包含在构建定义的源设置详细信息选项卡中。