我创建了一个CodeActivity用于(自定义)构建定义。此活动需要在执行其主要目的之前将位于服务器上的文件复制到/从“源目录”,“自定义文件夹”等位置复制到“放置目录”(等)。
我拥有的一些变量是有效路径,但其他变量显然是“相对路径”的占位符。但是,我需要物理服务器路径,以便我可以来回复制有用的项目。
我需要这样的事情:
当然,我可以将项目名称传递给活动(用于解析目的)......因为那只是'俗气'。
我的问题是:
我知道如何获得的一些事实:
这些项目有些用处,而其他项目则不那么有用。除非,我可以使用它们来获取物理服务器路径。
BuildDirectory:
'F:\ BLD \构建\ 41 \测试\ Test_CustomActivity_CreateNuGetPackages'
BuildDetail.DropLocationRoot:
'$ /测试/分出'
......希望我有物理路径
BuildDetail.BuildController.CustomAssemblyPath:
'$ /测试/ BuildProcessTemplates'
......希望我有物理路径
SourcesDirectory:
'F:\ BLD \构建\ 41 \测试\ Test_CustomActivity_CreateNuGetPackages \ src' 中
Workspace.Folders:
'F:\ BLD \构建\ 41 \测试\ Test_CustomActivity_CreateNuGetPackages \ SRC \测试\ NuGet.Research \ net35'
我想要的一些例子:
更新日期:2015年2月2日
@Edward - 根据您的要求。以下是我想要完成的更详细的解释。
答案 0 :(得分:14)
让我先说一下这个答案,说有很多术语重载,所以我想定义一些东西:
$/Test/BuildResources
是服务器路径。这是一个绝对的服务器路径,它不是相对的。D:\Test\BuildResources
或/home/me/test/buildresources
是本地路径。我将此定义为不是迂腐,但是因为使用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
,则需要确保它包含在“构建定义”的“源设置详细信息”选项卡中。