TFS API:GetLocalWorkspaceInfo始终返回null

Nic*_*man 27 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经检查过:

  • 完全相同的代码就像我应该的那样在我的另一台机器上工作.

  • 我已经确认我有一个工作区 C:\Dev

    工作区截图

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

  • 我查阅了文档,其中声明返回值为null if the path is not in a workspace.从上图中,路径应位于工作区中.

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

Val*_*ino 15

在我工作的公司从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);
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*man 14

tf workspaces它在Visual Studio 2010命令提示符下执行(在我的计算机上)No workspace matching * found on this computer,但是当在Visual Studio 2012中执行相同的命令时,它返回所有我期望的工作空间.

可以通过执行以下任一操作来解决此问题:

  • 引用Microsoft.TeamFoundation.VersionControl.Client与Visual Studio 2012连接的dll 版本,而不是与Visual Studio 2010连接的dll.

  • 打开Visual Studio 2010并将其连接到TFS,以便为Visual Studio 2010创建工作区

  • 谢谢!在我的情况下,我无法为TFS/Visual Studio 2013引用Microsoft.TeamFoundation.VersionControl.Client.dll,因为使用它的项目是使用VS2010构建的,目标是.net 3.5,Microsoft.TeamFoundation.VersionControl.Client.dll目标. net 4,因此Visual Studio 2010在构建期间会产生错误.当我启动Visual Studio 2010并连接到TFS 2013服务器并刷新工作区时,它可以正常工作,但不幸的是我每次都必须手动执行此操作并且尚未找到更合适的解决方法(尚未).在我的例子中,运行tf.exe工作区打印预期的工作区. (3认同)

小智 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(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

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


小智 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));
}
Run Code Online (Sandbox Code Playgroud)