GitHub下载文件的最新版本的URL?

时间:2014-06-06 15:52:49

标签: github

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

GitHub提供了一个“最新”网址,可以重定向到最新版本的信息页面。例如:https://github.com/reactiveui/ReactiveUI/releases/latest将重定向到https://github.com/reactiveui/ReactiveUI/releases/tag/5.99.6(因为我输入此内容;或者某天更新版本的页面)。

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

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

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

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

7 个答案:

答案 0 :(得分:14)

如果你在发行版中只有一个下载,这是一种没有Github的方法:

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

这很简单(虽然不是很漂亮),当然如果你想把它传递给某个东西,你可以换掉wget用于另一个curl调用。

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

答案 1 :(得分:3)

非常有趣,我没有注意到最新的"标签在GitHub发布了。正如我现在想的那样,如果您正在使用GitHubs发布系统的预发布和#34; - 能力,他们就会被放弃。但我不知道通过最新路径访问二进制文件的方法。

我建议您使用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

此解决方案基于最新标签也是最新版本的假设。

答案 2 :(得分:2)

我用它来获取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以外的其他平台。

答案 3 :(得分:2)

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

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

根据the docs

  

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

答案 4 :(得分:0)

在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 :(得分:0)

$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

答案 6 :(得分:-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进行下载。相反,人们应该使用"发布"。所以我是一个很好的doob并且每次都手动发布。然后我的.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!