如何用C#从TFS 2015识别成功构建项目及无项目时获取构建详情
嘿,我来帮你搞定这两个TFS 2015的C#开发问题!
1. 如何用C#从TFS 2015中确定哪些项目拥有成功的构建?
其实思路很直白:先获取TFS集合里的所有团队项目,然后逐个检查每个项目是否存在状态为成功的构建。下面是具体的实现步骤和代码:
- 首先引用必要的NuGet包:
Microsoft.TeamFoundationServer.Client(注意对应TFS 2015的版本,一般选14.x系列) - 通过
TfsTeamProjectCollection连接到你的TFS集合 - 获取所有团队项目列表
- 遍历每个项目,检查是否有成功的构建
代码示例:
using Microsoft.TeamFoundation.Build.WebApi; using Microsoft.TeamFoundation.Client; using Microsoft.TeamFoundation.Core.WebApi; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public async Task<List<TeamProjectReference>> GetProjectsWithSuccessfulBuilds(string collectionUri) { var successfulProjects = new List<TeamProjectReference>(); // 连接到TFS集合 using (var tpc = new TfsTeamProjectCollection(new Uri(collectionUri))) { tpc.EnsureAuthenticated(); // 获取项目客户端和构建客户端 var projectClient = tpc.GetClient<ProjectHttpClient>(); var buildClient = tpc.GetClient<BuildHttpClient>(); // 获取所有团队项目 var allProjects = await projectClient.GetProjects(); // 遍历每个项目,检查是否有成功构建 foreach (var project in allProjects) { // 查询该项目的成功构建(取最近的1个即可判断是否存在) var builds = await buildClient.GetBuildsAsync( project.Id, statusFilter: BuildStatus.Completed, resultFilter: BuildResult.Succeeded, top: 1); if (builds.Any()) { successfulProjects.Add(project); } } } return successfulProjects; }
这个方法会返回所有拥有至少一次成功构建的项目列表,你可以根据需要调整查询参数(比如时间范围、构建定义等)。
2. 能否在不指定具体项目的情况下,通过C#/.NET获取TFS成功构建的详细信息?
当然可以!你不需要绑定单个项目,直接调用Build API的全局查询能力就能拿到所有成功的构建记录,还能关联到对应的项目信息。下面是实现代码,基于你提供的现有代码扩展:
using Microsoft.TeamFoundation.Build.WebApi; using Microsoft.TeamFoundation.Client; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public async Task<List<Build>> GetAllSuccessfulBuilds(string collectionUri) { var successfulBuilds = new List<Build>(); using (var tpc = new TfsTeamProjectCollection(new Uri(collectionUri))) { tpc.EnsureAuthenticated(); var buildClient = tpc.GetClient<BuildHttpClient>(); // 全局查询所有成功完成的构建,不需要指定项目ID // 可以根据需求添加更多筛选条件:比如时间范围、构建定义、分支等 var builds = await buildClient.GetBuildsAsync( statusFilter: BuildStatus.Completed, resultFilter: BuildResult.Succeeded, top: 100); // 按需调整返回数量,或者分页获取 if (builds.Any()) { successfulBuilds.AddRange(builds); // 每个Build对象里包含Project属性,可以拿到项目的名称、ID等信息 // 比如 build.Project.Name 就能获取构建所属的项目名 } } return successfulBuilds; }
补充说明:
- 如果你需要更详细的构建信息(比如日志、关联的变更集等),可以调用
buildClient.GetBuildAsync(build.Id)获取单个构建的完整详情 - 注意TFS 2015的API有一些版本限制,确保你的NuGet包版本和TFS服务器版本匹配(14.x对应TFS 2015)
- 如果构建数量很多,建议使用分页查询(通过
continuationToken参数),避免一次性返回过多数据导致性能问题
内容的提问来源于stack exchange,提问作者Black Light
相关产品推荐
相关产品推荐

