适用于 .NET 的 Google Code 问题跟踪器 API






4.20/5 (2投票s)
适用于 .NET 的 Google Code 问题跟踪器客户端库。
引言
适用于 .NET 的 Google Code 问题跟踪器客户端库将允许 .NET 应用程序在 Google Code 项目托管服务中查看/更新问题。使用此库,任何 .NET 客户端应用程序都可以执行以下操作:
- 获取项目的所有问题。
- 向项目提交新问题。
- 获取与项目相关的所有评论。
- 在问题上创建新评论。
代码采用纯 C# 3.0 编写,但库兼容 .NET 2.0。该项目托管在 http://code.google.com/p/google-code-issue-tracker/。请访问那里获取最新更新。
背景
本项目与 Google 没有任何关联。标准的 GData 库没有适用于项目托管服务的 .NET API,这就是本项目诞生的原因。
Using the Code
该库使用 C# 3.0 和 Microsoft .NET framework v2 构建。任何以 .NET framework v2 或更高版本为目标的 .NET 客户端应用程序都可以使用该库。该库还兼容 Mono v2.x。以 Mono v2.x 或更高版本为目标的应用程序可以毫无兼容性问题地使用该库。
要使用 IssueTracker 库,您必须拥有一个 Google 帐户。如果您还没有,可以在此 https://www.google.com/accounts/Login 创建一个。
要开始使用 IssueTracker 库,您需要创建对三个库文件的引用:
- GCore.dll
- GCodeIssueTracker.dll
- System.Serialization.Xml.dll
System.Serialization.Xml 是一个处理 Google 服务 ATOM 提要 XML 的序列化和反序列化的库。有关此库的更多详细信息,请参阅文档文件。GCore.dll 是一个核心库,负责处理对象与 XML 之间的底层转换,以及从 Google 提交和检索数据。它公开了一些用于处理 ATOM 提要和 Google 服务的基类。有关进一步的详细信息,请参阅帮助文件。GCodeIssueTracker.dll 是处理 Google Code 问题跟踪器服务的主要库。它也使用 GCore.dll 来提交和检索问题和评论。有关进一步的详细信息,请参阅项目的帮助文件。
要使用该库,请添加以下 using
声明块:
using System.Net;
using GCore;
using GCodeIssueTracker;
using GCodeIssueTracker.Query;
使用 ClientLogin 凭证进行身份验证
GCore 库使用 ClientLogin 机制进行 Google Code 服务的身份验证。使用提供的用户名和密码初始化 ProjectHostingService
,后续调用将自动进行身份验证。
使用以下代码片段进行身份验证:
var service = new ProjectHostingService("project-name")
{
GUserName = "username@gmail.com",
GPassword = "gmailpassword",
ProxySettings = new WebProxy("proxy-host-address", port)
{
Credentials = new NetworkCredential
{
UserName = "proxy-username",
Password = "proxy-password"
}
}
};
有关 ProjectHostingService
类的更多详细信息,请参阅分发包中的帮助文件。
检索所有问题
要以提要的形式获取所有问题,请使用以下代码片段:
IssuesFeed resultFeed = service.GetAllIssues();
foreach (IssuesEntry item in resultFeed.Entries)
{
Console.WriteLine(item.Id + " " + item.Title);
}
IssuesFeed
是一个类,它将所有问题作为 IssuesEntry
对象集合和其他一些字段来保存。这些类直接映射到从服务获得的 XML ATOM 提要。System.Serialization.Xml
将这些类序列化为 Google 服务接受的 ATOM 提要,并将 ATOM 提要反序列化为这些对象。
ProjectHosti
类的 n
gServiceGetAllIssues()
方法按如下方式调用底层服务函数:
public IssuesFeed GetAllIssues()
{
GUrl = "http://code.google.com/feeds/issues/p/" +
ProjectName + "/issues/full";
return base.GetAllFeed<IssuesFeed, IssuesEntry>();
}
GUrl
是 GService
类的属性,它保存服务的提要 URL。GService
类大量使用泛型,但普通用户不必担心,因为这些复杂性完全隐藏在更高级别的服务类中。
使用查询参数检索问题
Google Code 问题跟踪器还为您提供了检索满足特定参数(如 ID、发布日期、所有者、作者等)的问题的功能。要查询服务,您必须先创建一个 IssueQuery
对象,然后将查询参数及其值附加到其中,最后调用服务函数 Query
来获取结果。以下是示例:
var query = new IssueQuery();
query.AppendQuery(QueryParamType.CanAll, "");
query.AppendQuery(QueryParamType.Author, "someauther");
query.AppendQuery(QueryParamType.Id, "104");
query.AppendQuery(QueryParamType.Label, "High");
query.AppendQuery(QueryParamType.MaxResults, "1000");
query.AppendQuery(QueryParamType.Owner, "username");
query.AppendQuery(QueryParamType.PublishedDateMax,
Utility.ToFriendlyDateString(DateTime.Today));
query.AppendQuery(QueryParamType.PublishedDateMin,
Utility.ToFriendlyDateString(DateTime.Today));
query.AppendQuery(QueryParamType.QueryString, "blogger");
query.AppendQuery(QueryParamType.Stars, "4");
query.AppendQuery(QueryParamType.Status, "Fixed");
query.AppendQuery(QueryParamType.UpdatedDateMax,
Utility.ToFriendlyDateString(DateTime.Today));
query.AppendQuery(QueryParamType.UpdatedDateMin,
Utility.ToFriendlyDateString(DateTime.MinValue));
Console.WriteLine(query.GetQueryUrl());
IssuesFeed resultFeed = service.Query(query);
foreach (IssuesEntry item in resultFeed.Entries)
{
Console.WriteLine(item.Id);
}
Console.WriteLine("Total feed : " + resultFeed.Entries.Count);
某些参数与其他参数是互斥的,例如 ID 不能与 max-result 一起出现在查询中。在这种情况下,将只考虑第一个附加的参数,而忽略其他参数。
检索问题的评论
要获取与特定问题相关的所有评论,您必须将问题 ID 传递给服务方法,如下所示:
IssueCommentsFeed resultFeed = service.GetAllIssueComments("104");
创建问题
这是本文档中最有价值的部分。使用此库,您可以直接从客户端应用程序将问题发布到 Google Code 项目。如果提交成功,服务方法将返回一个新的 IssueEntry
对象,其中包含其他信息,如问题 ID、发布日期等。下面是一个小示例:
var newEntry = new IssuesEntry
{
Author = new Author { Name = "username" },
Content = new Content { Type = "text",
Description = "Some Issue Descriptions" },
Owner = new Owner { UserName = "username" },
Status = "New",
Title = "Test One",
Labels = new List<string> { "Priority-Medium" },
Ccs = new List<Cc> { new Cc { UserName = "username" } }
};
int id = service.SubmitNewIssue(newEntry, "app-name").Id;
Console.WriteLine(id);
创建问题评论
创建评论与创建 IssueEntry
非常相似。方法如下:
IssueCommentsEntry entry = new IssueCommentsEntry();
entry.Author = new GCore.Author { Name = "TestCommentName" };
entry.Content = new GCore.Content { Description = "Test Comment" };
entry.Updates = new Updates
{
CcUpdates = new List<string> { "username" },
Labels = new List<string> { "Test Comment Update" },
Status = "New", Summary = "Test Summery",
UpdateOwner = "username"
};
IssueCommentsEntry newEntry =
service.SubmitNewIssueComment(entry, "7", "TestApp");
Console.WriteLine("New Comment's Id : " + newEntry .Id);
删除
由于 Google Code 问题跟踪器服务没有删除 API,因此必须使用 Web 界面来执行此操作。
关注点
整个代码库(除 Google 帐户授权外)都是从头开始编写的,采用了与官方 Google Data 库不同的方法。这种方法非常简洁且高度可扩展。GCore 库的编写方式使得任何依赖 ATOM 提要的 Google 服务都可以使用它来编写。这种可扩展性的主要公式是泛型。基服务类(即 GService
)的所有方法都是泛型的。您可以创建自己的自定义子 ATOM 提要/条目类,并在自己的子 Google 服务类中使用它。
System.Serialization.Xml 库也非常有用。它可以将任何类序列化为 XML,也可以从中反序列化。该库负责将 ATOM XML 转换为提要类。这是一个通用库,不局限于此项目。在底层,它也使用泛型进行序列化。也许我会写另一篇文章介绍这个小而有用的库。
历史
- 2010 年 1 月 9 日:初始发布。