TFS API:GetLocalWorkspaceInfo始终返回null

时间:2013-04-11 18:37:24

标签: c# tfs-sdk

在我的一台计算机上,我从任何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
        }
    }
}

我已经检查过:

  • 完全相同的代码可以按照应有的方式在我的其他机器上运行。

  • 我已经确认我的工作区位于C:\Dev

    Workspace Screenshot

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

  • 我咨询了the documentation,其中指出返回值为null if the path is not in a workspace。从上图中,路径应位于工作区中。

然而,一切似乎都表明这应该有效。有什么我可以失踪的吗?

8 个答案:

答案 0 :(得分:14)

在Visual Studio 2010命令提示符中执行 tf workspaces (在我的计算机上)时,它会显示 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创建工作区

答案 1 :(得分:14)

在我工作的公司从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);

我将上面的代码行添加到使用GetLocalWorkspaceInfo的TFS代理类的构造函数中。

答案 2 :(得分:8)

在我的情况下,出现此问题是因为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&#39; s(v12.0.0.0)Workstation类有一个函数 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

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

答案 3 :(得分:7)

我知道这是一篇旧帖子,但我想通过使用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));
}

答案 4 :(得分:1)

我最近(今天)使用Visual Studio 2017,以及安装的其他几个版本和许多本地工作区来解决此问题。

我最终更新了Team Foundation Server客户端&#39;通过“管理NuGet软件包”将NuGet软件包打包到最新版本(15.x)。菜单和修复它。

我还首先删除了现有的项目引用,但该部分可能取决于您的需求。

答案 5 :(得分: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)));

这也适合你。

答案 6 :(得分:0)

只需使用技巧即可运行。

没有适当的DLL引用,没有什么能正常工作。下面已经修复了我5天的相同问题,因为它搞砸了我的时间。

将以下DLL放在项目的bin文件夹中,并为所有DLL提供整个解决方案的参考。如果出现任何错误,请参阅&#39;无法提供参考&#39;忽略它并跳过该DLL提供引用而只是将错误创建DLL在bin文件夹中,项目将在构建期间自动获取

  

DLL&#39; S:

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

答案 7 :(得分:0)

在我的C:\Users\<username>\AppData\Local\Microsoft\Team Foundation文件夹中,我有2个文件夹:

  • 7.0

  • 8.0

8.0文件夹中有以下文件夹:

\Cache\Volatile\c1dbda02-c575-4dd2-b221-e83f7cb63665_http

但是在7.0文件夹中,\Cache\Volatile文件夹为空

所以我要做的就是跨c1dbda02-c575-4dd2-b221-e83f7cb63665_http文件夹复制到7.0\Cache\Volatile\

在此GetLocalWorkspaceInfo调用之后,成功返回了工作区信息