2013-04-11 133 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