从 TFS 获取当前迭代路径
Get the current iteration path from TFS
我正在尝试获取团队 TFS 项目的当前迭代路径。我尝试这样做的方法是使用来自 http://blog.johnsworkshop.net/tfs11-api-reading-the-team-configuration-iterations-and-areas/ 的博客。我首先从以下代码获取团队配置:
TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url");
var configSvc = tpc.GetService<TeamSettingsConfigurationService>();
var configs = configSvc.GetTeamConfigurationsForUser(projectUri);
这个问题是我的配置总是空的,即使我是团队的一员。我肯定我的项目 URI 也是正确的。在此之后,我将获取团队设置并使用它来显示当前的迭代路径。
TeamSettings ts = config.TeamSettings;
Console.WriteLine(ts.CurrentIterationPath);
即使这不起作用,我仍然可以从团队设置中查询迭代日期,以获取开始日期早于今天且完成日期晚于今天的迭代。主要问题是,当我尝试使用我的项目 URI 获取团队配置时,我无法将我的 TeamSettingsConfigurationService 设置为 return 除了 null。
你的服务器连接或你传递的项目 uri 一定有问题,因为其他代码看起来没问题。
也许可以试试这样:
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://server:8080/tfs/collection"),
new System.Net.NetworkCredential(tfsUserName, tfsPassword));
tpc.EnsureAuthenticated();
Connect to Team Foundation Server from a Console Application
您可以在此处下载一个很好的示例(WPF 客户端),它将允许您select 服务器连接、团队项目和团队:
TFS API Part 46 (VS11) – Team Settings
您可以单步执行它并检查您传递给代码的值。
示例获取团队配置信息的方式与您在代码中的方式相同。
TeamSettingsConfigurationService teamConfig = tfs.GetService<TeamSettingsConfigurationService>();
var configs = teamConfig.GetTeamConfigurationsForUser(new[] { projectInfo.Uri });
收集 TeamConfiguration
件物品后,您需要 TeamSettings.CurrentIterationPath
实际上我根本没有使用 TeamSettingsConfigurationService 就自己得到了答案。这是我的做法:
private static XmlNode currentIterationNode;
TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url");
ICommonStructureService4 css = tpc.GetService<ICommonStructureService4>();;
WorkItemStore workItemStore = new WorkItemStore(tpc);
foreach (Project teamProject in workItemStore.Projects)
{
if (teamProject.Name.Equals("TeamProjectNameGoesHere"))
{
NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString());
NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle"));
if (iterations != null)
{
XmlElement iterationsTree = css.GetNodesXml(new[] { iterations.Uri }, true);
XmlNodeList nodeList = iterationsTree.ChildNodes;
currentIterationNode = FindCurrentIteration(nodeList);
String currentIterationPath = currentIterationNode.Attributes["Path"].Value;
}
}
}
其中 currentIterationPath 是来自 TFS 的当前迭代路径。这样做的关键是从我从 chamindacNavantis https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b785ae7-66c0-47ee-a6d2-c0ad8a3bd420/tfs-get-iteration-dates-metadata?forum=tfsgeneral:
获得的这两行代码中获取结构的 NodeInfo[] 数组和 NodeInfo 迭代
NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString());
NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle"));
之后,我创建了一个 xml,其中包含团队项目中每个迭代的节点。这些节点还具有每次迭代的开始日期和结束日期。因此,我检查了每个节点的 DateTime.Now 之前的开始日期和 DateTime.Now 之后的结束日期,这就是 FindCurrentIteration(nodeList) 所做的全部工作。
这将为您提供当前的迭代节点。
我发现最简单的方法是使用 ICommonStructureService4
和 TeamSettingsConfigurationService
方法:
static TfsTeamProjectCollection _tfs = TfsTeamProjectCollectionFactory
.GetTeamProjectCollection("<tfsUri>")
(...)
static string GetCurrentIterationPath()
{
var css = _tfs.GetService<ICommonStructureService4>();
var teamProjectName = "<teamProjectName>";
var project = css.GetProjectFromName(teamProjectName);
var teamName = "<teamName>";
var teamSettingsStore = _tfs.GetService<TeamSettingsConfigurationService>();
var settings = teamSettingsStore
.GetTeamConfigurationsForUser(new[] { project.Uri })
.Where(c => c.TeamName == teamName)
.FirstOrDefault();
if (settings == null)
{
var currentUser = System.Threading.Thread.CurrentPrincipal.Identity.Name;
throw new InvalidOperationException(
$"User '{currentUser}' doesn't have access to '{teamName}' team project.");
}
return settings.TeamSettings.CurrentIterationPath;
}
我正在尝试获取团队 TFS 项目的当前迭代路径。我尝试这样做的方法是使用来自 http://blog.johnsworkshop.net/tfs11-api-reading-the-team-configuration-iterations-and-areas/ 的博客。我首先从以下代码获取团队配置:
TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url");
var configSvc = tpc.GetService<TeamSettingsConfigurationService>();
var configs = configSvc.GetTeamConfigurationsForUser(projectUri);
这个问题是我的配置总是空的,即使我是团队的一员。我肯定我的项目 URI 也是正确的。在此之后,我将获取团队设置并使用它来显示当前的迭代路径。
TeamSettings ts = config.TeamSettings;
Console.WriteLine(ts.CurrentIterationPath);
即使这不起作用,我仍然可以从团队设置中查询迭代日期,以获取开始日期早于今天且完成日期晚于今天的迭代。主要问题是,当我尝试使用我的项目 URI 获取团队配置时,我无法将我的 TeamSettingsConfigurationService 设置为 return 除了 null。
你的服务器连接或你传递的项目 uri 一定有问题,因为其他代码看起来没问题。
也许可以试试这样:
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://server:8080/tfs/collection"),
new System.Net.NetworkCredential(tfsUserName, tfsPassword));
tpc.EnsureAuthenticated();
Connect to Team Foundation Server from a Console Application
您可以在此处下载一个很好的示例(WPF 客户端),它将允许您select 服务器连接、团队项目和团队:
TFS API Part 46 (VS11) – Team Settings
您可以单步执行它并检查您传递给代码的值。
示例获取团队配置信息的方式与您在代码中的方式相同。
TeamSettingsConfigurationService teamConfig = tfs.GetService<TeamSettingsConfigurationService>();
var configs = teamConfig.GetTeamConfigurationsForUser(new[] { projectInfo.Uri });
收集 TeamConfiguration
件物品后,您需要 TeamSettings.CurrentIterationPath
实际上我根本没有使用 TeamSettingsConfigurationService 就自己得到了答案。这是我的做法:
private static XmlNode currentIterationNode;
TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url");
ICommonStructureService4 css = tpc.GetService<ICommonStructureService4>();;
WorkItemStore workItemStore = new WorkItemStore(tpc);
foreach (Project teamProject in workItemStore.Projects)
{
if (teamProject.Name.Equals("TeamProjectNameGoesHere"))
{
NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString());
NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle"));
if (iterations != null)
{
XmlElement iterationsTree = css.GetNodesXml(new[] { iterations.Uri }, true);
XmlNodeList nodeList = iterationsTree.ChildNodes;
currentIterationNode = FindCurrentIteration(nodeList);
String currentIterationPath = currentIterationNode.Attributes["Path"].Value;
}
}
}
其中 currentIterationPath 是来自 TFS 的当前迭代路径。这样做的关键是从我从 chamindacNavantis https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b785ae7-66c0-47ee-a6d2-c0ad8a3bd420/tfs-get-iteration-dates-metadata?forum=tfsgeneral:
获得的这两行代码中获取结构的 NodeInfo[] 数组和 NodeInfo 迭代 NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString());
NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle"));
之后,我创建了一个 xml,其中包含团队项目中每个迭代的节点。这些节点还具有每次迭代的开始日期和结束日期。因此,我检查了每个节点的 DateTime.Now 之前的开始日期和 DateTime.Now 之后的结束日期,这就是 FindCurrentIteration(nodeList) 所做的全部工作。 这将为您提供当前的迭代节点。
我发现最简单的方法是使用 ICommonStructureService4
和 TeamSettingsConfigurationService
方法:
static TfsTeamProjectCollection _tfs = TfsTeamProjectCollectionFactory
.GetTeamProjectCollection("<tfsUri>")
(...)
static string GetCurrentIterationPath()
{
var css = _tfs.GetService<ICommonStructureService4>();
var teamProjectName = "<teamProjectName>";
var project = css.GetProjectFromName(teamProjectName);
var teamName = "<teamName>";
var teamSettingsStore = _tfs.GetService<TeamSettingsConfigurationService>();
var settings = teamSettingsStore
.GetTeamConfigurationsForUser(new[] { project.Uri })
.Where(c => c.TeamName == teamName)
.FirstOrDefault();
if (settings == null)
{
var currentUser = System.Threading.Thread.CurrentPrincipal.Identity.Name;
throw new InvalidOperationException(
$"User '{currentUser}' doesn't have access to '{teamName}' team project.");
}
return settings.TeamSettings.CurrentIterationPath;
}