TFS API:GetLocalWorkspaceInfo始终返回null
在我的一台机器上,我从任何GetLocalWorkspaceInfo
调用中获得null的返回值。 对于这个简单的程序,我已经孤立到问题甚至失败了:
namespace WorkstationTest { using Microsoft.TeamFoundation.VersionControl.Client; class Program { static void Main() { string workspaceLocalPath = @"C:\Dev"; var info = Workstation.Current .GetLocalWorkspaceInfo(workspaceLocalPath); // info is always null here } } }
我已经检查过:
-
完全相同的代码以我们应该的方式在我的其他机器上运行。
-
我已经validation我在
C:\Dev
有一个工作区 -
我创建了一个新工作区并在另一个目录中,并更改了代码中的
workspaceLocalPath
变量以匹配。 -
我已经查阅了文档 , 该文档声明
if the path is not in a workspace
中,返回值将为null。 从上图中,路径应位于工作区中。
然而,一切似乎都表明这应该有效。 有什么我可以失踪的吗?
我知道这是一篇旧post,但我想通过使用VersionControlServer.QueryWorkspaces在他/她的机器上查询用户的所有工作区来分享我们的解决方法。
private static Workspace FindWorkspaceByPath(TfsTeamProjectCollection tfs, string workspacePath) { VersionControlServer versionControl = tfs.GetService(); WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(workspacePath); if (workspaceInfo != null) { return versionControl.GetWorkspace(workspaceInfo); } // No Workspace found using method 1, try to query all workspaces the user has on this machine. Workspace[] workspaces = versionControl.QueryWorkspaces(null, Environment.UserName, Environment.MachineName); foreach (Workspace w in workspaces) { foreach (WorkingFolder f in w.Folders) { if (f.LocalItem.Equals(workspacePath)) { return w; } } } throw new Exception(String.Format("TFS Workspace cannot be determined for {0}.", workspacePath)); }
在Visual Studio 2010命令提示符下执行tf workspaces
(在我的计算机上)时,它No workspace matching * found on this computer
“ No workspace matching * found on this computer
,但在Visual Studio 2012中执行相同命令时,它将返回所有预期的工作区。
可以通过执行以下任一操作来解决此问题:
-
引用与Visual Studio 2012连接的
Microsoft.TeamFoundation.VersionControl.Client
dll的版本,而不是与Visual Studio 2010连接的dll。 -
打开Visual Studio 2010并将其连接到TFS,以便为Visual Studio 2010创建工作区
在我工作的公司从TFS2013迁移到TFS2017后,我遇到了与Workstation.Current.GetLocalWorkspaceInfo相同的问题。
对我有用的是调用Workstation.EnsureUpdateWorkspaceInfoCache
:
TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("")); VersionControlServer tfServer = tpc.GetService(); Workstation.Current.EnsureUpdateWorkspaceInfoCache(tfServer, tfServer.AuthorizedUser);
我将上面的代码行添加到使用GetLocalWorkspaceInfo的TFS代理类的构造函数中。
在我的情况下,出现此问题是因为VersionControl.config文件放在TFS缓存下(C:\ Users \ DeepakR \ AppData \ Local \ Microsoft \ Team Foundation \ 5.0 \ Cache \ Volatile \ 0cb76a25-2556-4bd6-adaa-5e755ac07355_http)文件夹进行折腾,即配置的工作区信息无法按预期方式使用。
所以,它基本上需要刷新VersionControl.config文件。 当Visual Studio再次加载时会发生Auto Refersh,即它从Server中提取已配置的工作区信息并更新配置文件,或者即使我们执行tf命令实用程序(tf.exe workspaces / collection:TFSURL)
Microsoft.TeamFoundation.VersionControl.Client(v12.0.0.0)工作站类有一个函数EnsureUpdateWorkspaceInfoCache ,它将执行相同的操作
VersionControlServer vcs =(VersionControlServer)tpc.GetService(typeof(VersionControlServer)); Workstation.Current.EnsureUpdateWorkspaceInfoCache(vcs,Environment.UserName);
希望该建议有助于解决问题。
我最近(今天)使用Visual Studio 2017,以及安装的其他几个版本和许多本地工作区来解决此问题。
我最终通过’Manage NuGet Packages’菜单将’Team Foundation Server Client’NuGet包更新到最新版本( 15.x
)并修复了它。
我还首先删除了现有的项目引用,但该部分可能取决于您的需求。
这是在有服务器路径时查找工作区的方法:
Workspace[] workspaces = _versionControl.QueryWorkspaces(null, Environment.UserName, Environment.MachineName); return workspaces.FirstOrDefault(w => !string.IsNullOrEmpty(w.TryGetLocalItemForServerItem(ConstDefaultFlowsTfsPath)));
其中ConstDefaultFlowsTfsPath
是服务器路径,例如"$"
: "$/MyCompany/Services/DiagnosticsFlows"
您还可以将最后一行替换为:
return workspaces.FirstOrDefault(w => !string.IsNullOrEmpty(w.GetServerItemForLocalItem(myLocalPath)));
这对你也有用。
简单地运用技巧 。
没有适当的DLL引用,没有什么能够正常工作。 下面已经修复了我5天的相同问题,因为它搞砸了我的时间。
将下面的DLL放在项目的bin文件夹中,并为所有DLL提供整个解决方案的参考。 如果出现任何错误,如’无法给出参考’,请忽略它并跳过该DLL提供引用,而只是将错误创建DLL在bin文件夹中,项目将在构建期间自动执行
DLL的:
Microsoft.TeamFoundation.Client.dll Microsoft.TeamFoundation.Common.dll Microsoft.TeamFoundation.Core.WebApi.dll Microsoft.TeamFoundation.TestManagement.Client.dll Microsoft.TeamFoundation.TestManagement.Common.dll Microsoft.TeamFoundation.Work.WebApi.dll Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll Microsoft.TeamFoundation.WorkItemTracking.Client.dll Microsoft.TeamFoundation.WorkItemTracking.Common.dll Microsoft.TeamFoundation.WorkItemTracking.Controls.dll Microsoft.TeamFoundation.WorkItemTracking.Proxy.dll Microsoft.TeamFoundation.WorkItemTracking.WebApi.dll Microsoft.VisualStudio.Services.Client.Interactive.dll Microsoft.VisualStudio.Services.Common.dll Microsoft.VisualStudio.Services.WebApi.dll Microsoft.WITDataStore32.dll Microsoft.WITDataStore64.dll
如果系统安装了MTM或TFS,则可以在以下路径中找到上述dll
路径: C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TeamFoundation \ Team Explorer