从TFS

时间:2015-07-14 21:18:08

标签: c# .net tfs tfs2013 tfs-sdk

我试图获得团队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返回任何空值。

3 个答案:

答案 0 :(得分:4)

您的服务器连接或您传递的项目必定存在问题,因为其他代码看起来还不错。

也许尝试这样的事情:

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客户端),它将允许您选择服务器连接,团队项目和团队:

TFS API Part 46 (VS11) – Team Settings

您可以单步执行它并检查您传递给代码的值。

示例获取团队配置信息的方式与代码中的相同。

TeamSettingsConfigurationService teamConfig = tfs.GetService<TeamSettingsConfigurationService>();
    var configs = teamConfig.GetTeamConfigurationsForUser(new[] { projectInfo.Uri });

收集TeamConfiguration项后,您需要TeamSettings.CurrentIterationPath

答案 1 :(得分:0)

我实际上没有使用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)所做的全部。 这将为您提供当前的迭代节点。

答案 2 :(得分:0)

我发现这样做的最简单方法是使用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;
}