【问题标题】:Is it possible to get all the projects and subprojects using TFS API是否可以使用 TFS API 获取所有项目和子项目
【发布时间】:2018-05-22 02:37:19
【问题描述】:

我正在研究 TFS API。我正在尝试从 TFS 获取项目、子项目、文件的整个列表。 有人可以指导我。

TfsTeamProjectCollection teamProjectCollection = teamFoundationserver.TfsTeamProjectCollection;
ProjectCollection projCollect = (ProjectCollection) teamProjectCollection.GetService(typeof(ProjectCollection));

上面的代码只是显示了 TFS 的第一层。我怎样才能更深入地了解 TFS 树。 我想要整个项目列表,以及每个项目下的解决方案

谢谢, SV

【问题讨论】:

  • 我已经可以获取项目集合,但是每个项目集合下和该解决方案下都有项目。这是我所追求的解决方案。谢谢!
  • 是的。一旦你有了树,你就可以遍历树来遍历你所有的解决方案。我们为几种类型的审计流程执行此操作。

标签: tfs c#-4.0


【解决方案1】:

没有“子项目”这样的东西。听起来您想要做的是获取每个项目下所有子文件夹/文件的列表。

为此,请遍历您的每个项目,并在每个项目上执行 GetItems。这是一些代码:

TfsTeamProjectCollection teamProjectCollection = new TfsTeamProjectCollection(new Uri("http://sw100429:8080"));

ProjectCollection projCollect = (ProjectCollection)teamProjectCollection.GetService(typeof(ProjectCollection));

VersionControlServer vcs = teamProjectCollection.GetService<VersionControlServer>();

// This approach lets you get the list of files for each team project individually.

foreach (TeamProject tp in projCollect)
{
    string path = string.Format("$/{0}", tp.Name);
    var filesAndFolders = vcs.GetItems(path, RecursionType.Full);
}


// However, this approach is a bit more succinct - instead
// of getting them for each team project, just start at "$/" and work your way down

var allFilesAndFolders = vcs.GetItems("$/", RecursionType.Full);

【讨论】:

  • 嗨,Robaticus——正如我上面所说——我不是在关注文件夹,而是关注每个项目下的解决方案。嗯,即使是文件和文件夹也会提供新的视图。谢谢!
【解决方案2】:

通过您的问答(谢谢),经过大量的试验和错误,我能够将这个样本放在一起。它更进一步展示了如何映射本地路径。我希望这可以避免一些读者头痛。

此示例在 VS 2015 中以表格形式组合在一起,并使用以下程序集引用(也很难追踪)

全部位于我机器上的 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\vl45o2it.tph

Microsoft.TeamFoundation.Client.dll
Microsoft.TeamFoundation.Common.dll
Microsoft.TeamFoundation.VersionControl.Client.dll
Microsoft.VisualStudio.TeamFoundation.dll

如果我的术语在某些地方出现问题,我们深表歉意。我不介意您编辑其中的任何内容。

using System;
using System.Linq;
using System.Windows.Forms;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Framework.Common;
using Microsoft.TeamFoundation.Framework.Client;
using System.Diagnostics;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace Tfs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            Uri tfsUri = new Uri("http://server:8080/tfs");
            string repositoryName = "yourrepository";
            string projectPath = "$/project/path/path/path";

            Uri repositoryUri = new Uri(string.Format("{0}/{1}", tfsUri.AbsoluteUri, repositoryName));

            TfsConfigurationServer tfscs = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);

            //get the repository
            CatalogNode repository = tfscs.CatalogNode.QueryChildren(new Guid[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)
                .FirstOrDefault(a => string.Compare(a.Resource.DisplayName, repositoryName, true) == 0);

            //open in the project collection
            TfsTeamProjectCollection pc = tfscs.GetTeamProjectCollection(new Guid(repository.Resource.Properties["InstanceId"]));

            //tfs project file structure access
            VersionControlServer vcs = pc.GetService<VersionControlServer>();

            WorkspaceInfo wsi = Workstation.Current.GetAllLocalWorkspaceInfo().FirstOrDefault(a => a.ServerUri == repositoryUri);

            //user functionality (checkin, localpaths etc)
            Workspace ws = wsi.GetWorkspace(pc);

            //get the file structure
            ItemSet items = vcs.GetItems(projectPath, RecursionType.Full);

            foreach (Item i in items.Items)
            {
                Debug.WriteLine(string.Format("{0} ({1}) - {2} - {3}", i.ServerItem,
                                                                       i.ContentLength.ToString(),
                                                                       i.ItemType.ToString(),
                                                                       ws.GetLocalItemForServerItem(i.ServerItem)));
            }
        }

    }
}

【讨论】:

  • 所提供的建议似乎都没有办法获得项目下的解决方案。我会跟进您对 VersionControlServer 的建议,看看是否有帮助。我们的情况是一个包含多个项目的项目集合,每个项目包含一个或多个解决方案。
  • 并且每个解决方案都包含一个或多个 Visual Studio 项目(而不是 TFS 项目)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多