如何通过 TFS 2012 锁定本地工作区下的文件 API
How to lock a file under local workspace via TFS 2012 API
我正在尝试通过 workspace.PendEdit
使用独占锁 LockLevel.CheckOut
签出单个文件。以下函数成功(无错误)但它似乎对 TFS 中的文件没有影响(未签出且未锁定)。
public static void Lock(string filePath)
{
var workspace = GetWorkspace(filePath);
workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.CheckOut);
}
我怀疑这与我的 TFS 工作区是本地的有关。但是,Visual Studio 2015 似乎可以通过 [Source Control Explorer]->[Right Click Selected File]->[Advanced]->[Lock]
建立对文件的锁定没有问题。我在做什么与 VS 在做什么不同?我错过了什么吗?
您应该使用 RecursionType.Full 而不是 RecursionType.None。
workspace.PendEdit(new[] {filePath}, RecursionType.Full, null, LockLevel.CheckOut);
PendEdit() 方法 return 为您指定的文件路径检查的文件数 out/locked。 RecursionType.Full 将递归到路径的最后一个子节点。
更新:
请尝试为您的 API 项目安装此 TFS nuget 程序包 (https://www.nuget.org/packages/Microsoft.TeamFoundationServer.ExtendedClient/) 并测试此问题是否仍然存在。如果可以的话,无论你用什么版本的VS,都不会出现这个问题。
经过反复试验,我最终为 NonFatalError
实现了一个事件处理程序,如下所示:
private static void VersionControlServer_NonFatalError(object sender, ExceptionEventArgs e)
{
if (e.Failure != null && e.Failure.Severity == SeverityType.Error)
throw new ApplicationException("An internal TFS error occurred. See failure message for details:\r\n"+e.Failure.Message);
}
一旦事件处理程序通过 versionControlServer.NonFatalError += VersionControlServer_NonFatalError;
连接到 versionControlServer
对象,我就能够看到我的独占 check-outs 发生了什么。事实证明,TFS 静默 失败并出现以下错误:
TF400022: The item $/Fake/Server/Path/project.config cannot be locked for checkout in workspace MYWORKSPACE;Dan Lastname. Checkout locks are not supported in local workspaces.
解决方案是将 LockLevel
从 LockLevel.CheckOut
更改为 LockLevel.Checkin
。它的锁类型略有不同,但足以满足我的需要,这就是当您尝试在 local 工作空间中锁定文件时 VS 使用的锁类型。所以这是我的原始函数,LockLevel
中的微小变化使所有的不同。
public static void Lock(string filePath)
{
var workspace = GetWorkspace(filePath);
workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.Checkin);
}
我正在尝试通过 workspace.PendEdit
使用独占锁 LockLevel.CheckOut
签出单个文件。以下函数成功(无错误)但它似乎对 TFS 中的文件没有影响(未签出且未锁定)。
public static void Lock(string filePath)
{
var workspace = GetWorkspace(filePath);
workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.CheckOut);
}
我怀疑这与我的 TFS 工作区是本地的有关。但是,Visual Studio 2015 似乎可以通过 [Source Control Explorer]->[Right Click Selected File]->[Advanced]->[Lock]
建立对文件的锁定没有问题。我在做什么与 VS 在做什么不同?我错过了什么吗?
您应该使用 RecursionType.Full 而不是 RecursionType.None。
workspace.PendEdit(new[] {filePath}, RecursionType.Full, null, LockLevel.CheckOut);
PendEdit() 方法 return 为您指定的文件路径检查的文件数 out/locked。 RecursionType.Full 将递归到路径的最后一个子节点。
更新: 请尝试为您的 API 项目安装此 TFS nuget 程序包 (https://www.nuget.org/packages/Microsoft.TeamFoundationServer.ExtendedClient/) 并测试此问题是否仍然存在。如果可以的话,无论你用什么版本的VS,都不会出现这个问题。
经过反复试验,我最终为 NonFatalError
实现了一个事件处理程序,如下所示:
private static void VersionControlServer_NonFatalError(object sender, ExceptionEventArgs e)
{
if (e.Failure != null && e.Failure.Severity == SeverityType.Error)
throw new ApplicationException("An internal TFS error occurred. See failure message for details:\r\n"+e.Failure.Message);
}
一旦事件处理程序通过 versionControlServer.NonFatalError += VersionControlServer_NonFatalError;
连接到 versionControlServer
对象,我就能够看到我的独占 check-outs 发生了什么。事实证明,TFS 静默 失败并出现以下错误:
TF400022: The item $/Fake/Server/Path/project.config cannot be locked for checkout in workspace MYWORKSPACE;Dan Lastname. Checkout locks are not supported in local workspaces.
解决方案是将 LockLevel
从 LockLevel.CheckOut
更改为 LockLevel.Checkin
。它的锁类型略有不同,但足以满足我的需要,这就是当您尝试在 local 工作空间中锁定文件时 VS 使用的锁类型。所以这是我的原始函数,LockLevel
中的微小变化使所有的不同。
public static void Lock(string filePath)
{
var workspace = GetWorkspace(filePath);
workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.Checkin);
}