【发布时间】:2010-09-30 03:41:42
【问题描述】:
有没有办法使用 TFS API 以编程方式确定 Visual Studio 中打开的 sln/proj 的当前工作区?我已经看到 VersionControlServer 如何检索所有已知的工作区,但有什么可以用来将其与用户当前已打开(或未打开)的内容联系起来的吗?
【问题讨论】:
有没有办法使用 TFS API 以编程方式确定 Visual Studio 中打开的 sln/proj 的当前工作区?我已经看到 VersionControlServer 如何检索所有已知的工作区,但有什么可以用来将其与用户当前已打开(或未打开)的内容联系起来的吗?
【问题讨论】:
Dave Teply 方法的问题在于,它假设您已经拥有一个 VersionControlServer 或至少 TeamFoundationServerUri 的实例。
不过,还有一种更强大的方法,using the Workstation class。 Ricci Gian Maria has written a quite extensive blog post 关于这个话题。下面的 sn-p 是那篇文章的要点:
使用 Workstation 类获取您要查找的路径的 WorkspaceInfo,这将搜索在该工作站上注册的所有 TFS 服务器的工作区,以查看是否有匹配项:
Workstation workstation = Workstation.Current;
WorkspaceInfo info = workstation.GetLocalWorkspaceInfo(path);
现在您有了 WorkspaceInfo,您可以将其连接到 TFS,工作区信息包含该特定团队项目集合的 ProjectCollectionUri。然后是 Workspace 实例:
TfsTeamProjectCollection collection = new TfsTeamProjectCollection(info.ServerUri);
Workspace workspace = info.GetWorkspace(collection);
使用集合或工作区然后访问 VersionControlServer:
VersionControlServer versionControlServer = collection.GetService<VersionControlServer>();
【讨论】:
实例化的VersionControlServer 对象的GetWorkspace 方法还有另一个覆盖。您可以使用 Bernhard 状态的本地路径调用 GetWorkspace,但您也可以使用工作区名称和工作区所有者来调用它。由于工作区名称默认为本地计算机名称,您通常可以使用Environment.MachineName,但总会有开发人员更改工作区名称。
例子:
TeamFoundationServerFactory _tfs = TeamFoundationServerFactory.GetServer(server);
_tfs.EnsureAuthenticated();
VersionControlServer _vcs = (VersionControlServer)_tfs.GetService(typeof(VersionControlServer));
Workspace _ws = _vcs.GetWorkspace(Environment.MachineName, Environment.UserName);
【讨论】:
如果您可以确定解决方案或项目文件的物理路径,那么您可以在 TFS 中查询该文件,您应该会看到哪个工作区已映射到该本地文件位置。
【讨论】: