web-dev-qa-db-ja.com

TFS API:GetLocalWorkspaceInfoは常にnullを返します

私のマシンの1つで、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変数を一致するように変更しました。

  • 私は ドキュメント を調べましたが、これは戻り値がnullになると述べていますif the path is not in a workspace。上の画像から、パスはワークスペース内にあるはずです。

それでも、すべてがこれが機能するはずであることを示唆しているようです。足りないものはありますか?

29
Nick Freeman

これが古い投稿であることは知っていますが、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));
}
7
eddiecjc

Visual Studio 2010コマンドプロンプトでtf workspaces(私のコンピューター上)を実行するとNo workspace matching * found on this computerと表示されますが、VisualStudioで同じコマンドを実行すると2012それは私の予想されるすべてのワークスペースを返します。

この問題は、次のいずれかを実行することで解決できます。

  • Visual Studio 2010に接続されているdllではなく、Visual Studio2012に接続されているMicrosoft.TeamFoundation.VersionControl.Clientdllのバージョンを参照してください。

  • Visual Studio 2010を開き、TFSに接続して、Visual Studio2010のワークスペースを作成します。

14
Nick Freeman

私が働いている会社で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プロキシクラスのコンストラクターに上記のコード行を追加しました。

14
Valvestino

私の場合、この問題は、TFSキャッシュ(C:\ Users\DeepakR\AppData\Local\Microsoft\Team Foundation\5.0\Cache\Volatile\0cb76a25-2556-4bd6-adaa-5e755ac07355_http)に配置されたVersionControl.configファイルが原因で発生しました。フォルダーがトスになります。つまり、構成されたワークスペース情報が期待どおりに利用できませんでした。

したがって、基本的にVersionControl.configファイルを更新する必要があります。自動参照は、Visual Studioが再度読み込まれると発生します。つまり、サーバーから構成済みのワークスペース情報を取得して構成ファイルを更新するか、tfコマンドユーティリティ(tf.exe Workspaces/collection:TFSURL)を実行した場合でも発生します。

Microsoft.TeamFoundation.VersionControl.Client's(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

提案が問題の解決に役立つことを願っています。

8

最近(今日)Visual Studio 2017に加えて、他のいくつかのバージョンがインストールされ、いくつかのローカルワークスペースを使用してこの問題が発生しました。

'Team Foundation Server Client' NuGetパッケージを最新バージョンに更新することになりました(15.x)[NuGetパッケージの管理]メニューから修正しました。

また、最初に既存のプロジェクト参照を削除しましたが、その部分は必要なものによって異なる場合があります。

1
Sean Normoyle

私の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呼び出しの後、ワークスペース情報が正常に返されました

0
PRS

サーバーパスがある場合、ワークスペースを見つける方法は次のとおりです。

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

そしてそれはあなたにもうまくいくはずです。

0
Mr.B

単にトリックで実行する

適切なDLL参照がないと、何も正しく機能しません。以下は、5日間同じ問題を修正し、時間を無駄にしていました。

以下のDLLをプロジェクトのbinフォルダーに配置し、すべてのDLLのソリューション全体への参照を提供します。 「参照を指定できませんでした」などのエラーが発生した場合は、無視してスキップし、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                                          

システムがMTMまたはTFSとともにインストールされている場合、上記のdllは以下のパスにあります。

パス: C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer

0