2013-04-11 135 views
24

在我的一台机器上,任何GetLocalWorkspaceInfo调用都会​​返回空值。我已经隔离,问题在那里,即使失败,这个简单的程序:TFS API:GetLocalWorkspaceInfo总是返回空

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 
     } 
    } 
} 

我已经检查:

  • 完全相同的代码工作我的另一台计算机上的方式应该。

  • 我核实,我有一个工作区在C:\Dev

    Workspace Screenshot

  • 我创建了一个新的工作区,并在不同的目录,并在代码以匹配改变workspaceLocalPath变量。

  • 我查阅了the documentation其中说明返回值为空if the path is not in a workspace。从上面的图片中,路径应该位于工作区中。

然而,一切似乎表明这应该工作。有什么我可能会失踪?

+1

如果您调用'WorkspaceInfo [] everything = Workstation.Current.GetAllLocalWorkspaceInfo()',您会得到什么? – 2013-04-11 18:53:06

+0

@ConradClark我刚刚发现了这个问题,我正在写一个答案。如果我不知道类似的东西,那么这条线会给我确切的推动力。 'GetAllLocalWorkspaceInfo'会返回没有工作空间。感谢您的帮助! – 2013-04-11 18:56:42

+0

是否降低了护理人员解释问题的错误以及如何改进的问题? – 2013-04-25 19:51:51

回答

5

我知道这是一个旧帖子,但就像我们通过使用VersionControlServer.QueryWorkspaces来为他/她的机器上的用户查询所有工作区一样,共享我们的解决方法。

private static Workspace FindWorkspaceByPath(TfsTeamProjectCollection tfs, string workspacePath) 
{ 
    VersionControlServer versionControl = tfs.GetService<VersionControlServer>(); 

    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)); 
} 
+0

感谢您的分享! – 2016-04-26 20:08:04

+0

对我而言,它不起作用。 f.LocalItem永远不会等于工作区路径,因为我的工作路径是存在于文件夹系统内部的文件夹。 – 2016-07-20 12:04:48

+0

另一个需要记住的地方是'Environment.UserName'并不总是实际的TFS用户名。因此,您可能需要将参数更改为“QueryWorkspaces”以匹配TFS用户名。 – Nathan 2017-01-25 21:33:13

14

当在Visual Studio 2010中的命令执行tf workspaces(我的电脑上),提示它说No workspace matching * found on this computer,但在Visual Studio 2012中执行相同的命令,当它返回我所有的预期工作空间。

问题可以通过执行以下任一来解决:在Microsoft.TeamFoundation.VersionControl.Client DLL的

  • 参考的版本与的Visual Studio 2012而不是使用Visual Studio连接的dll连接2010

  • 打开Visual Studio 2010,并把它连接到TFS到它会创建工作区的Visual Studio 2010

+0

谢谢!这为我做了。我使用过v10 DLL,因为我们的服务器是TFS2010,但是因为我在本地使用Visual Studio 2012,所以我需要使用v11 DLL。 – ben 2013-06-27 10:38:25

+1

@ben我很高兴看到这帮助了别人!我一直在努力处理一些措辞,但对于正在经历相同事情的人来说,这可能是有意义的。如果您看到一种方法可以改进我所说的内容,这会更容易理解您最终必须做些什么来修复它,请随时编辑。 – 2013-06-27 11:08:39

+1

@ben另外,我要发布一个跟进问题,因为我们的一些团队仍然在使用VS2010和一些正在使用VS2012。问题在于为什么必须单独管理工作区,以及是否有办法根据管理对象的运行情况来管理该dll引用。我从来没有去过它。你认为这也是有益的吗? – 2013-06-27 11:11:42

7

在我的情况下,出现这种问题,是因为在TFS缓存把VersionControl.config文件(C:\用户\ DeepakR \应用程序数据\本地\微软\的Team Foundation \ 5.0 \缓存\挥发性\ 0cb76a25-2556 -4bd6-adaa-5e755ac07355_http)文件夹进行折腾,即配置的工作区信息不可用按预期。

所以,它基本上需要刷新VersionControl.config文件。自动Refersh发生在Visual Studio中被再次加载,即从服务器拉配置工作区的信息,并更新配置文件或者即使我们执行命令TF实用程序(tf.exe工作区/集:TFSURL)

Microsoft.TeamFoundation.VersionControl .Client的(v12.0.0。0)工作站类具有如下功能:EnsureUpdateWorkspaceInfoCache这将做同样的特技

VersionControlServer VCS =(VersionControlServer)tpc.GetService(typeof运算(VersionControlServer)); Workstation.Current.EnsureUpdateWorkspaceInfoCache(VCS,Environment.UserName);

https://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.workstation.ensureupdateworkspaceinfocache(v=vs.120).aspx

希望建议有助于解决这个问题。

0

这是如何找到工作区时,你有服务器的路径:

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))); 

,并应为你工作了。

1

我最近(今天)使用Visual Studio 2017年,再加上安装了几个其他版本和一些当地的工作区有这个问题。

我最终通过“管理的NuGet包”菜单更新“Team Foundation Server的客户端” NuGet包到最新版本(15.x)和固定它。

我也首先删除现有的项目引用,但该部分可能取决于你所需要的。

12

从TFS2013在我公司为我工作迁移到TFS2017后曾与Workstation.Current.GetLocalWorkspaceInfo同样的问题。

什么工作对我来说是Workstation.EnsureUpdateWorkspaceInfoCache呼叫:

TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("<your-tfs-uri-here>")); 
VersionControlServer tfServer = tpc.GetService<VersionControlServer>(); 
Workstation.Current.EnsureUpdateWorkspaceInfoCache(tfServer, tfServer.AuthorizedUser); 

我加了上面的代码行到我的TFS代理类的使用GetLocalWorkspaceInfo构造。

+0

GetLocalWorkspaceInfo在YEARS正常工作后突然返回null。将这三行代码放在调用上方可以立即解决问题。 – 2017-05-30 18:35:59

+0

这应该是答案。 – 2017-09-29 09:26:56

+0

这是我正在寻找的解决方案,值得注意的是,这段代码可能只需要执行一次,之后可能会被删除。 – friznani 2017-12-19 16:17:15

0

简单地用技巧运行。

没有什么会不正确的DLL参考正常工作。下面的问题解决了我在5天内遇到的同样问题,因为它让我的时间紧张起来。

将下面的DLL在项目的bin文件夹,并给所有的DLL的整个解决方案的参考。如果有错误出现,如“参考不能给予”忽略它和给予的参考,而不是仅仅的地方也是错误产生的bin文件夹中的DLL该项目将建立在

DLL的自动采取跳过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           

以上的DLL可以在下面的路径中,如果系统中安装MTM或TFS

路径: C:\ Program Files文件(x86)的\微软的Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TeamFoundation \ Team Explorer