3

我正在努力使用 github graphql 界面来获取我需要的数据。我想获取标签和版本的资产 url 列表。似乎有些回购产生了我想要的结果,而另一些则什么也没产生。

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 存储库时,它显然具有发布资产。

为什么他们没有显示在这个查询中?当我查看 git 时,每个版本和标签都有资产,即使在我的查询中,结果也是命中或未命中。我错过了什么?

4

1 回答 1

2

target 是一个git 引用,在这种情况下它可以指向一个Tag或一个Commit对象。当它指向 aCommit时,您的查询将返回预期结果,因为...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
  }
}

在资源管理器中尝试

请注意,在上面的示例中,我使用了片段来减小查询大小并提高可读性

我的猜测是,如果 ref 指向一个Tag对象,该对象是一个可以保存消息的带注释的标签,一个特定的标签日期和标签信息。如果它指向一个Commit对象,它就是一个轻量级标签,它只是链接到一个提交

于 2018-12-25T16:11:12.593 回答