【问题标题】:GitHub URL for latest release of the _download file_?_下载文件_最新版本的 GitHub URL?
【发布时间】:2014-07-27 23:14:56
【问题描述】:

虽然这个问题与GitHub latest release相似,但实际上是不同的——它是关于一个链接,意思是“下载文件本身的最新版本”。

GitHub 提供了一个“最新” URL,该 URL 重定向到最新版本的信息页面。例如:https://github.com/reactiveui/ReactiveUI/releases/latest 将重定向到 https://github.com/reactiveui/ReactiveUI/releases/tag/5.99.6(当我输入此内容时;或者有一天会重定向到更新版本的页面)。

这很好,但我需要 下载文件本身的 URL。在此示例中,与绿色下载按钮相关联的 .zip 文件 https://github.com/reactiveui/ReactiveUI/releases/download/5.99.6/ReactiveUI-5.99.6.zip(当我键入此内容时;或者某个较新的 zip 文件)。

为什么?我想将 URL 作为 Travis CI 脚本的一部分提供给 curl 以下载最新版本。

我猜到了几个 URL,例如 /releases/download/latest/file.zip(用“latest”代替版本部分)和 /releases/download/file.zip 但那些 404。

有没有办法做到这一点——在 shell 脚本和 curl 的上下文中(注意:不是在带有 JS 的浏览器页面中)?

【问题讨论】:

    标签: github


    【解决方案1】:

    非常有趣,我还没有注意到 GitHub-releases 中的“最新”标签。正如我现在发现的那样,如果您使用的是 GitHub 发布系统的“预发布”功能,它们就会被放弃。但我不知道通过最新路径访问二进制文件的任何方法。

    我想建议你使用 git(在你的 travis-vm 中可用)来下载最新的标签。

    就像 Julien Renault 在他的博客 post 中描述的那样,您将能够像这样检查存储库中的最新标签:

    # this step should be optional
    git fetch --tags
    
    latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)
    git checkout $latestTag
    

    这个方案是基于latest标签也是最新版本的假设。

    【讨论】:

    • 虽然我不确定我是否理解您的大部分答案与我的问题有什么关系,但您“使用 git”的想法是正确的。我当然应该使用它——谢谢!
    • @greghendershott - 我很高兴我给了你解决方案的提示。不幸的是,我不知道您正在寻找有关如何发布自己的存储库并通过 github 提供其最新版本的答案。这可以通过分支latest 更轻松地完成。但我无法深入挖掘,因为我正拿着手机在海滩上闲逛。 :)
    • 你可以简单地使用latestTag=$(git rev-list --tags --max-count=1)
    【解决方案2】:

    正如@florianb 指出的,我应该使用 git

    最初我的 .travis.yml 是这样的:

    before_install:
    - curl -L https://raw.githubusercontent.com/greghendershott/travis-racket/master/install-racket.sh | bash
    

    这将自动从 repo 中获取最新版本。

    但有人向我指出,GitHub 不希望人们使用 raw.github.com 进行下载。相反,人们应该使用“发布”。所以我是个好人,每次都手动发布。然后我的 .travis.yml 是这样的:

    before_install:
    - curl -L https://github.com/greghendershott/travis-racket/releases/download/v0.6/install-racket.sh | bash
    

    但每次发布都是 PITA。更糟糕的是,所有 .travis.yml 文件都需要更新以指向该文件的较新版本。

    相反 -- 只需使用 git 克隆 repo,并使用其中的文件:

    before_install:
    - git clone https://github.com/greghendershott/travis-racket.git
    - cat travis-racket/install-racket.sh | bash # pipe to bash not sh!
    

    【讨论】:

    • 3 年后有人对此投了反对票,哈哈。恭喜,互联网上有问题,您已修复! :)
    • 而且没有太多评论:-(
    【解决方案3】:

    如果您在发行版中有单个下载,则可以使用以下方法在不使用 Github 的情况下执行此操作:

    wget $(curl -s https://api.github.com/repos/USERNAME/REPONAME/releases/latest | grep 'browser_' | cut -d\" -f4)
    

    这很简单(虽然不是很漂亮),当然如果你想通过管道将 wget 换成另一个 curl 调用。

    基本上,curl 调用为您提供一个 JSON 结构,我只是使用基本的 shell 实用程序来提取下载 URL。

    【讨论】:

    • 我一直在寻找这个。谢谢!只是为了让它更丑更简单,我在grep "docker-machine-`uname -s`-`uname -m`" 中添加了一个最终管道。只要您不在 Windows 上就可以工作。
    • 实际上我也一直在考虑将其编写为 Go 命令行。 :) 我会记住这一点的。
    • 如果您的版本具有唯一的文件名,而不是 grepping 'browser_' 您也可以使用 grep 文件名。这让我帮助指定并帮助在具有多个下载的版本中仅下载正确的文件。
    • 要删除 wget 依赖,curl -L $(curl -s https://api.github.com/repos/USER/REPO/releases/latest | grep browser_ | cut -d\" -f4)。而且,正如@Arda 所提到的,您可以在| grep browser_ 之后通过管道传输到另一个| grep PATTERN,以根据资产名称缩小范围。
    • 无需从 API 获取发布版本。见 haykams 回答:github.com/owner/repository/releases/latest/download/ASSET.ext
    【解决方案4】:

    在 Windows 上,仅使用 powershell,这对我有用。它可能会写得更短。

    #Downloads latest paket.bootstrapper.exe from github
    $urlbase = "https://github.com"
    $latestPage="$urlbase/fsprojects/Paket/releases/latest"
    Write-Host "Parsing latest release page: $latestPage"
    $page=Invoke-Webrequest -uri $latestPage
    $latestBootStrapper=($page.Links | Where-Object { $_.href -match "bootstrapper" }).href
    
    $dlurl="$urlbase$latestBootStrapper"
    Write-Host "Downloading paket.bootstrapper.exe from $dlurl"
    
    $wc=new-object net.webclient
    $wc.UseDefaultCredentials=$true
    $wc.Proxy.Credentials=$wc.Credentials
    $wc.DownloadFile($dlurl, (join-path (resolve-path ".\") "paket.bootstrapper.exe"))
    

    【讨论】:

      【解决方案5】:

      我使用它来获取 PowerShell 5+ 中的下载 URL(替换 ACCOUNT 和 REPO)

      Invoke-RestMethod -uri  https://api.github.com/repos/ACCOUNT/REPO/releases/latest | select -ExpandProperty assets | select -expand browser_download_url 
      

      请注意,如果他们有多个包裹,这将是一个列表。如果您想选择某个名称,请找到名称的唯一部分,即 win for Windows 并使用: (替换 ACCOUNT、REPO 和 SELECTOR)

      Invoke-RestMethod -uri  https://api.github.com/repos/ACCOUNT/REPO/releases/latest | select -ExpandProperty assets | ? { $_.name.Contains("SELECTOR")} | select -expand browser_download_url
      

      如果您将以上内容分配给一个变量,那么您可以获取文件并使用以下内容提取它(假设您分配给 $uri):

      Invoke-WebRequest $uri -OutFile "release.zip"
      Expand-Archive .\release.zip
      

      在 PowerShell 6+ 中,这应该可以在 Windows 以外的其他平台上运行。

      【讨论】:

        【解决方案6】:

        对于资产名称中不包含版本号或其他可变内容的版本,您可以使用以下格式的 URL:

        https://github.com/owner/repository/releases/latest/download/ASSET.ext

        根据the docs

        如果您想直接链接到最新版本资产的下载,您可以链接到/owner/name/releases/latest/download/asset-name.zip

        【讨论】:

        • 这是我在 Windows 上编写脚本时的首选选项。例如。下载最新版本的 AWS Vault 时,我使用:https://github.com/99designs/aws-vault/releases/latest/download/aws-vault-windows-386.exe。而当前版本(截至今天)位于https://github.com/99designs/aws-vault/releases/download/v6.2.0/aws-vault-windows-386.exe。当然,您应该处理该 URL 上没有此类文件的情况。
        【解决方案7】:
        $repoName = "PowerShell/PowerShell"
        $assetPattern = "*-win-x64.msi"
        $extractDirectory = "C:\Users\Public\Downloads"
        
        
        $releasesUri = "https://api.github.com/repos/$repoName/releases/latest"
        $asset = (Invoke-WebRequest $releasesUri | ConvertFrom-Json).assets | Where-Object name -like $assetPattern
        $downloadUri = $asset.browser_download_url
        
        $extractPath = [System.IO.Path]::Combine($extractDirectory, $asset.name)
        Invoke-WebRequest -Uri $downloadUri -Out $extractPath
        

        【讨论】:

          【解决方案8】:

          您可以将 curl 与 https://api.github.com 一起使用。它提供 JSON 输出,您可以使用 jq 或您最喜欢的 json 工具轻松提取所需的内容。

          例如,使用问题中的存储库:

          gituser=reactiveui; repo=ReactiveUI
          
          tag_name=$(curl -sL https://api.github.com/repos/$gituser/$repo/releases/latest | jq -r '.tag_name'); echo $tag_name
          # output: "16.3.10"
          
          tarurl=$(curl -sL https://api.github.com/repos/$gituser/$repo/releases/latest | jq -r '.tarball_url'); echo $tarurl
          # output: https://api.github.com/repos/reactiveui/ReactiveUI/tarball/16.3.10
          
          zipurl=$(curl -sL https://api.github.com/repos/$gituser/$repo/releases/latest | jq -r '.zipball_url'); echo $zipurl
          # output: https://api.github.com/repos/reactiveui/ReactiveUI/zipball/16.3.10
          

          因此,您可以在单行中使用嵌套的curl 进行下载:

          curl -OL $(curl -sL https://api.github.com/repos/filesender/filesender/releases/latest | jq -r '.tarball_url')
          

          这将下载文件,并以tag_name 的名称保存它,但没有扩展名。因此,您可能希望通过附加“.tgz”或“.zip”来重命名它,具体取决于您下载的内容。

          Windows 用户注意事项:curl 现在默认安装在 Windows 上,但请注意它必须被称为 curl.exe。那是因为Powershell有一个别名愚蠢地叫做“curl”,它不一样!

          【讨论】:

            猜你喜欢
            • 2014-02-21
            • 2012-11-13
            • 2015-03-29
            • 1970-01-01
            • 2016-11-11
            • 1970-01-01
            • 2014-03-22
            • 2020-09-12
            • 1970-01-01
            相关资源
            最近更新 更多