私のマシンの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
にワークスペースがあることを確認しました
新しいワークスペースを別のディレクトリに作成し、コード内のworkspaceLocalPath
変数を一致するように変更しました。
私は ドキュメント を調べましたが、これは戻り値がnullになると述べていますif the path is not in a workspace
。上の画像から、パスはワークスペース内にあるはずです。
それでも、すべてがこれが機能するはずであることを示唆しているようです。足りないものはありますか?
これが古い投稿であることは知っていますが、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));
}
Visual Studio 2010コマンドプロンプトでtf workspaces
(私のコンピューター上)を実行するとNo workspace matching * found on this computer
と表示されますが、VisualStudioで同じコマンドを実行すると2012それは私の予想されるすべてのワークスペースを返します。
この問題は、次のいずれかを実行することで解決できます。
Visual Studio 2010に接続されているdllではなく、Visual Studio2012に接続されているMicrosoft.TeamFoundation.VersionControl.Client
dllのバージョンを参照してください。
Visual Studio 2010を開き、TFSに接続して、Visual Studio2010のワークスペースを作成します。
私が働いている会社で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プロキシクラスのコンストラクターに上記のコード行を追加しました。
私の場合、この問題は、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);
提案が問題の解決に役立つことを願っています。
最近(今日)Visual Studio 2017に加えて、他のいくつかのバージョンがインストールされ、いくつかのローカルワークスペースを使用してこの問題が発生しました。
'Team Foundation Server Client' NuGetパッケージを最新バージョンに更新することになりました(15.x
)[NuGetパッケージの管理]メニューから修正しました。
また、最初に既存のプロジェクト参照を削除しましたが、その部分は必要なものによって異なる場合があります。
私の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
呼び出しの後、ワークスペース情報が正常に返されました
サーバーパスがある場合、ワークスペースを見つける方法は次のとおりです。
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)));
そしてそれはあなたにもうまくいくはずです。
単にトリックで実行する。
適切な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