我正在努力使用 github graphql 接口(interface)来获取我需要的数据。我想获取标签和版本的 Assets URL 列表。似乎有些 repo 产生了我想要的结果,而另一些则什么也没有产生。
query {
repository(owner:"erlang",name:"otp") {
releases(last:100) {
edges {
node {
url
releaseAssets(last:100) {
edges {
node {
downloadUrl
}
}
}
tag {
name
target {
... on Commit {
zipballUrl
tarballUrl
}
}
}
}
}
}
tags:refs(refPrefix:"refs/tags/", last:30) {
edges {
tag:node {
name
target {
sha:oid
commitResourcePath
... on Commit {
zipballUrl
tarballUrl
author {
name
email
date
}
}
}
}
}
}
}
}
该查询按原样生成我想要的结果(或至少其中一些),而 owner:"spring-projects",name:"spring-framework"生成没有 tarball 的标签。当我查看 spring-framework repo 时,它显然有发布 Assets 。
为什么他们没有显示在此查询中?当我查看 git 时,每个版本和标签都有 Assets ,即使在我的查询中,结果也有问题。我错过了什么?
最佳答案
目标是 git reference , 在这种情况下它可以指向 Tag
或 Commit
目的。当它指向 Commit
时,您的查询将返回预期结果,因为 ...on Commit
不为空。要获取 Tag
以及尝试使用 ...on Tag
并根据您的需要提取标记器或它指向的提交。这是一个例子:
{
repository(owner: "spring-projects", name: "spring-framework") {
releases(last: 100) {
edges {
node {
url
releaseAssets(last: 100) {
edges {
node {
downloadUrl
}
}
}
tag {
...refInfo
}
}
}
}
tags: refs(refPrefix: "refs/tags/", last: 30) {
edges {
node {
...refInfo
}
}
}
}
}
fragment refInfo on Ref {
name
target {
sha: oid
commitResourcePath
__typename
... on Tag {
target {
... on Commit {
...commitInfo
}
}
tagger {
name
email
date
}
}
... on Commit {
...commitInfo
}
}
}
fragment commitInfo on Commit {
zipballUrl
tarballUrl
author {
name
email
date
}
}
请注意,在上面的示例中,我使用了 fragments减少查询大小并提高可读性
我的猜测是,如果 ref 指向一个 Tag
对象,那是一个 annotated tag它可以包含一条消息、一个特定的标记日期和标记器信息。如果它指向一个 Commit
对象,它就是一个 lightweight tag这只是链接到一个提交
关于标签和发布 Assets url 的 Github 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53862730/