从 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) 所做的全部工作。 这将为您提供当前的迭代节点。

我发现最简单的方法是使用 ICommonStructureService4TeamSettingsConfigurationService 方法:

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