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

Pri*_*ERO 7 c# tfs workflow-activity tfsbuild

我已经创建了一个CodeActivity,用于(自定义)构建定义.在执行其主要目的之前,此活动需要将位于服务器上的文件复制到/从"源目录","自定义文件夹"等位置复制到"放置目录"(等).

我所拥有的一些变量是有效路径,但其他变量显然是"相对路径"的占位符.但是,我需要物理服务器路径,以便我可以来回复制有用的项目.

我需要的东西:

  • 项目根的物理路径(见下图)
  • 能够解析自定义文件夹的物理路径(参见下图)
  • 能够从"相对路径"解析物理路径会很高兴

当然,我可以将项目名称传递给活动(用于解析目的)......因为那只是'俗气'.

我的问题是:

  • 如何解析TFS项目根的物理路径?
  • 一旦我解析了root,我可以依靠它来"构建"自定义文件夹的路径吗?
  • 如何从'$/Test/Drops'等相对路径获取服务器路径?

我知道如何获得的一些事实:
这些项目有些用处,而其他项目......并非如此.除非,我可以使用它们来获取物理服务器路径.

BuildDirectory:
'F:\ bld\Builds\41\Test\Test_CustomActivity_CreateNuGetPackages'

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

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

SourcesDirectory:
'F:\ bld\Builds\41\Test\Test_CustomActivity_CreateNuGetPackages\src'

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

我想要的一些例子:
在此输入图像描述

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

在此输入图像描述 在此输入图像描述

Edw*_*son 14

让我先说这个答案,说有很多术语重载,所以我想定义一些东西:

  • 服务器路径:版本控制系统中文件或文件夹的路径.例如,$/Test/BuildResources服务器路径.这是一个绝对的服务器路径,它不是相对的.
  • 本地路径:您已在服务器上映射服务器路径的路径.例如,D:\Test\BuildResources或者/home/me/test/buildresources本地路径.
  • 映射:服务器路径和本地路径之间的对应关系 - 以便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);
Run Code Online (Sandbox Code Playgroud)

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

workspace.GetServerItemForLocalItem("D:\My\Local\Path");
Run Code Online (Sandbox Code Playgroud)

workspace.GetLocalItemForServerItem("$/My/Server/Path");
Run Code Online (Sandbox Code Playgroud)

但是,如果构建定义实际上将工作空间设置为包含这些文件,则此机制将起作用.如果您需要某个目录$/Foo/Bar,则需要确保它包含在"构建定义"的"源设置详细信息"选项卡中.