Получить текущий путь итерации из TFS
Я пытаюсь получить текущий путь итерации для проекта teams 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);
Проблема в том, что мои конфигурации всегда пусты, даже если я член команды. Я уверен, что мои проекты Ури также верны. После этого я бы получил параметры команды и использовать их для отображения текущего пути итерации.
TeamSettings ts = config.TeamSettings;
Console.WriteLine(ts.CurrentIterationPath);
Даже если это не сработало, я все равно могу запросить даты итераций из настройки команды, чтобы получить одну итерацию, которая имеет дату начала до сегодняшнего дня и дату окончания после сегодняшнего дня. Основная проблема заключается в том, что я не могу заставить TeamSettingsConfigurationService возвращать что-либо, кроме null, когда я пытаюсь получить конфигурации команды с помощью URI моих проектов.
3 ответа:
Должно быть что-то не так с вашим подключением к серверу или uri проекта, который вы передаете, поскольку другой код выглядит нормально.
Может быть, попробовать что-то вроде этого:
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://server:8080/tfs/collection"), new System.Net.NetworkCredential(tfsUserName, tfsPassword)); tpc.EnsureAuthenticated();
Подключение к Team Foundation Server из консольного приложения
Здесь есть хороший пример, который вы можете скачать (клиент WPF), и он позволит вам выбрать соединение с сервером, командный проект и команду:
TFS API Part 46 (VS11) - настройки команды
Вы можете шагать через него и проверьте значения, которые вы передаете в свой код.
Пример получает информацию о конфигурации команды таким же образом, как и у вас в коде.
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. Ключом к этому было получение массива структур NodeInfo[] и итераций NodeInfo из этих двух строк кода, которые я получил от chamindacNavantis https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b785ae7-66c0-47ee-a6d2-c0ad8a3bd420/tfs-get-iteration-dates-metadata?forum=tfsgeneral:
NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString()); NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle"));
После этого я создал xml с узлами каждой итерации внутри командного проекта. Эти узлы также имеют дату начала и дату окончания каждой итерации. Поэтому я проверил каждый узел на наличие даты начала до даты-времени.Теперь и закончить дату после даты-времени.Теперь, что все 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; }