我正在使用TFS对象模型在命令行上做一些工作,我想重现在tf.exe和tfpt.exe中看到的工作空间检测行为,而不会因为我自己的特定实现而引入工件。目前,我的脚本需要的信息比tf.exe需要的更多 - 我的大量参数只是为了实例化连接。
具体来说,我必须要求用户显式传入服务器Uri(tfsUriString)和集合名称(tfsCollectionName),但这似乎是不必要的,因为tf.exe能够做到这一点很烦人。
Uri tfsUri = new Uri(tfsUriString);
TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);
ReadOnlyCollection<CatalogNode> collectionNodes = configurationServer.CatalogNode.QueryChildren( new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);
CatalogNode collectionNode = collectionNodes.Where(node => node.Resource.DisplayName == tfsCollectionName).SingleOrDefault();
Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
var vcServer = teamProjectCollection.GetService<VersionControlServer>();
可以使用哪些类和方法以与tf.exe相同的方式执行此检测?
答案 0 :(得分:5)
Team Foundation Server客户端使用工作空间缓存,其中包含他们从当前计算机使用的每个Team Project Collection的所有用户工作空间。 tf.exe
使用此缓存来确定用于命令行上给出的路径的TfsTeamProjectCollection
和Workspace
。
您可以使用以下命令获取特定本地路径的缓存WorkspaceInfo
:
Workstation.Current.GetLocalWorkspaceInfo(localPath)
或者您可以通过调用以下方式获取整个工作区缓存:
Workstation.Current.GetAllLocalWorkspaceInfo()
WorkspaceInfo.ServerUri
属性将包含可用于创建TfsTeamProjectCollection
的服务器URI。