使用 Github 的 GraphQL 列出所有标签并搜索版本
Using Github's GraphQL to list all tags and search for releases
我正在尝试使用 GraphQL 从存储库中获取所有标签,然后(或者如果可能,在同一命令中)获取每个标签发布的一些详细信息。
我正在尝试使用这种方法 git/refs/tags
-> releases/tags/[tag_name]
因为按 releases
列出所有版本并没有给我完整的版本列表。
在 v3 中,这相当于:
"https://api.github.com/repos/" + repo + "/git/refs/tags"
"https://api.github.com/repos/" + repo + "/releases/tags/" + tag
在 GraphQL Explorer 中,我能够构建此查询(替换为您自己的用户名和 repo):
{
repository(owner: ":UserName", name: ":Repository") {
refs(refPrefix: "refs/tags/", last: 100) {
edges {
node {
name
}
}
}
}
}
但它给出了这个结果:
{
"data": {
"repository": {
"refs": {
"edges": [
{
"node": {
"name": "2.1"
}
},
{
"node": {
"name": "2.2"
}
},
{
"node": {
"name": "2.3"
}
},
[...]
我也需要以某种方式将其放入查询中(只是一个例子,我也需要其他字段),采用 name
并用作参数:
repository(owner: ":UserName", name: ":Repository") {
release(tagName: name) {
name
}
}
这样尝试:
query ListTags {
repository(owner: ":Username", name: ":Repository") {
refs(refPrefix: "refs/tags/", last: 100) {
edges {
node {
name
repository {
release(tagName: Ref.name) {
name
}
}
}
}
}
}
}
但是我无法使用 Ref.name
作为 release
的参数。
在我的项目中使用查询时,返回的对象包含所有 JSON 个节点,而不仅仅是 name
字段。
var httpClient = new HttpClient
{
BaseAddress = new Uri("https://api.github.com/graphql")
};
httpClient.DefaultRequestHeaders.Add("User-Agent", "ReleaseSearcher");
var basicValue = Convert.ToBase64String(Encoding.UTF8.GetBytes($"username:key"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basicValue);
var queryObject = new
{
query = @"query {
repository(owner: "":Username"", name: "":repo"") {
refs(refPrefix: ""refs/tags/"", last: 100) {
edges {
node {
name
}
}
}
}
}",
variables = new { }
};
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
Content = new StringContent(JsonConvert.SerializeObject(queryObject), Encoding.UTF8, "application/json")
};
dynamic responseObj;
using (var response = await httpClient.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
responseObj = JsonConvert.DeserializeObject<dynamic>(responseString);
}
Console.WriteLine(responseObj.data.viewer.login);
Console.ReadLine();
如何使用标签名称搜索单个版本?
如何正确读取结果数据?
我用这个得到了我想要的东西:
query {
rateLimit {
cost
remaining
}
repository(owner: "NickeManarin", name: "ScreenToGif") {
refs(refPrefix: "refs/tags/", last: 100) {
nodes {
repository {
releases(last: 100, orderBy: { field: CREATED_AT, direction: DESC}) {
nodes {
name
createdAt
url
releaseAssets(last: 2) {
nodes {
name
downloadCount
downloadUrl
}
}
}
}
}
}
}
}
}
我只是不确定这是否是最好的方法。
我正在尝试使用 GraphQL 从存储库中获取所有标签,然后(或者如果可能,在同一命令中)获取每个标签发布的一些详细信息。
我正在尝试使用这种方法 git/refs/tags
-> releases/tags/[tag_name]
因为按 releases
列出所有版本并没有给我完整的版本列表。
在 v3 中,这相当于:
"https://api.github.com/repos/" + repo + "/git/refs/tags"
"https://api.github.com/repos/" + repo + "/releases/tags/" + tag
在 GraphQL Explorer 中,我能够构建此查询(替换为您自己的用户名和 repo):
{
repository(owner: ":UserName", name: ":Repository") {
refs(refPrefix: "refs/tags/", last: 100) {
edges {
node {
name
}
}
}
}
}
但它给出了这个结果:
{
"data": {
"repository": {
"refs": {
"edges": [
{
"node": {
"name": "2.1"
}
},
{
"node": {
"name": "2.2"
}
},
{
"node": {
"name": "2.3"
}
},
[...]
我也需要以某种方式将其放入查询中(只是一个例子,我也需要其他字段),采用 name
并用作参数:
repository(owner: ":UserName", name: ":Repository") {
release(tagName: name) {
name
}
}
这样尝试:
query ListTags {
repository(owner: ":Username", name: ":Repository") {
refs(refPrefix: "refs/tags/", last: 100) {
edges {
node {
name
repository {
release(tagName: Ref.name) {
name
}
}
}
}
}
}
}
但是我无法使用 Ref.name
作为 release
的参数。
在我的项目中使用查询时,返回的对象包含所有 JSON 个节点,而不仅仅是 name
字段。
var httpClient = new HttpClient
{
BaseAddress = new Uri("https://api.github.com/graphql")
};
httpClient.DefaultRequestHeaders.Add("User-Agent", "ReleaseSearcher");
var basicValue = Convert.ToBase64String(Encoding.UTF8.GetBytes($"username:key"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basicValue);
var queryObject = new
{
query = @"query {
repository(owner: "":Username"", name: "":repo"") {
refs(refPrefix: ""refs/tags/"", last: 100) {
edges {
node {
name
}
}
}
}
}",
variables = new { }
};
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
Content = new StringContent(JsonConvert.SerializeObject(queryObject), Encoding.UTF8, "application/json")
};
dynamic responseObj;
using (var response = await httpClient.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
responseObj = JsonConvert.DeserializeObject<dynamic>(responseString);
}
Console.WriteLine(responseObj.data.viewer.login);
Console.ReadLine();
如何使用标签名称搜索单个版本?
如何正确读取结果数据?
我用这个得到了我想要的东西:
query {
rateLimit {
cost
remaining
}
repository(owner: "NickeManarin", name: "ScreenToGif") {
refs(refPrefix: "refs/tags/", last: 100) {
nodes {
repository {
releases(last: 100, orderBy: { field: CREATED_AT, direction: DESC}) {
nodes {
name
createdAt
url
releaseAssets(last: 2) {
nodes {
name
downloadCount
downloadUrl
}
}
}
}
}
}
}
}
}
我只是不确定这是否是最好的方法。