是否有一个链接到GitHub下载文件的最新版本的存储库?

使用GitHub的发布功能,可以提供一个链接来下载已发布软件的特定版本。然而,每次发布时,gh-page也需要更新。

有没有一种方法可以获取到软件最新版本的特定文件的链接?

例如,这将是一个静态链接:

https://github.com/USER/PROJECT/releases/download/v0.0.0/package.zip

我想要的是:

https://github.com/USER/PROJECT/releases/download/latest/package.zip

注:这个问题和 GitHub最新发布是 这个问题特别要求访问文件, 而不是GitHub最新发布的页面

105467 次浏览

链接到版本帮助页面确实提到了“最新发布”按钮,但这并没有给你一个下载链接。

https://github.com/reactiveui/ReactiveUI/releases/latest

为此,你需要先获取最新的标签(如“GitHub URL最新发布的下载文件?”中提到的那样):

latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)


curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip

你可以执行ajax请求来获取最新版本的下载URL。它还显示了它的发布时间和下载计数:

function GetLatestReleaseInfo() {
$.getJSON("https://api.github.com/repos/ShareX/ShareX/releases/latest").done(function(release) {
UpdateDownloadButton(release, ".exe", $(".setup"));
UpdateDownloadButton(release, "portable.zip", $(".portable"));
});
}


function UpdateDownloadButton(release, assetExtension, element) {
let asset = release.assets.find(asset => asset.name.endsWith(assetExtension));
let releaseInfo = "Version: " + release.tag_name.substring(1) +
"\nFile size: " + (asset.size / 1024 / 1024).toFixed(2) + " MB" +
"\nRelease date: " + new Date(asset.updated_at).toLocaleDateString("en-CA") +
"\nDownload count: " + asset.download_count.toLocaleString();


element.attr("href", asset.browser_download_url);
element.attr("title", releaseInfo);
}


GetLatestReleaseInfo();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a class="setup" href="https://github.com/ShareX/ShareX/releases/latest">Setup</a>
<a class="portable" href="https://github.com/ShareX/ShareX/releases/latest">Portable</a>

当请求完成时,按钮的URL将自动更改为直接下载URL。

获取最新发行版资产下载链接的Linux解决方案(仅在发行版只有一个资产时有效)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4

另一个Linux解决方案使用curl和wget从最新发布页面下载一个二进制文件

curl -s -L https://github.com/bosun-monitor/bosun/releases/latest | egrep -o '/bosun-monitor/bosun/releases/download/[0-9]*/scollector-linux-armv6' | wget --base=http://github.com/ -i - -O scollector

解释:

curl -s -L是无声地下载最新版本的HTML(在执行重定向之后)

egrep -o '...'使用regex来查找你想要的文件

wget --base=http://github.com/ -i -将相对路径从管道转换为绝对URL

-O scollector设置所需的文件名。

可能只能在文件更新的情况下将-N添加到下载,但S3给出了403禁止错误。

使用curljq从命令行检索最新的版本的第一个文件:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
jq --raw-output '.assets[0] | .browser_download_url'

只需使用下面的网址之一下载最新版本: (以boxbilling项目中的url为例):https://api.github.com/repos/boxbilling/boxbilling/releases

下载最新版本为zip: https://api.github.com/repos/boxbilling/boxbilling/zipball < / p >

下载最新版本tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball < / p >

点击其中一个网址立即下载最新版本。当我写这行时,它目前是:boxbilling - boxbilling - 4.20 - 30 - g452ad1c [. zip / gz]

更新:在我的日志文件中发现了一个其他url(参考上面的例子) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master < / p >

我想从存储库描述中的README.md文件下载版本。在那里,我无法执行JavaScript。

我可以为我所有的存储库在README文件或github页面中添加这样的链接:

    <李> https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE> < br > . . <李> https://niccokunzmann.github.io/download_latest/<FILE> < br > 这是因为JavaScript引用器已经设置好,要下载的存储库是通过document.referrer确定的。因此,该链接也适用于fork

你可以找到源代码在这里, fork或只是使用我的回购。

如前所述,金桥对于this和其他REST api是有用的。

Tl;dr -详情如下

假设你想要macOS版本:

URL=$( curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
| jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url' )
curl -LO "$URL"

原子释放的解决方案

请注意每个repo可以有不同的方式提供所需的工件,所以我将演示一个良好的行为像原子

发布资产的名称

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
| jq -r '.assets[] | .name'


atom-1.15.0-delta.nupkg
atom-1.15.0-full.nupkg
atom-amd64.deb
...

获取所需资产的下载URL

下面atom-mac是我想要的资产通过jq的select(.name=="atom-mac.zip")

curl -s "https://api.github.com/repos/atom/atom/releases/latest" \
| jq -r '.assets[] | select(.name=="atom-mac.zip") | .browser_download_url'


https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip

下载工件

curl -LO "https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip"

金桥操场

jq语法可能很难。下面是一个实验上面的jq的操场: https://jqplay.org/s/h6_LfoEHLZ < / p >

安全

如果可能的话,您应该采取措施确保通过Sha256sum和GPG下载的工件的有效性。

在PHP -重定向到最新版本下载。简单地放在你的网络空间

<?php


/**
* Download latest release from github release articats
* License: Public Domain
*/


define('REPO', 'imi-digital/iRobo');


$opts = [
'http' => [
'method' => 'GET',
'header' => [
'User-Agent: PHP'
]
]
];


$context = stream_context_create($opts);


$releases = file_get_contents('https://api.github.com/repos/' . REPO . '/releases', false, $context);
$releases = json_decode($releases);


$url = $releases[0]->assets[0]->browser_download_url;


header('Location: ' . $url);

使用(内部)wget获取HTML内容,过滤zip文件(使用egrep),然后下载zip文件(使用外部wget)的解决方案。

wget https://github.com/$(wget https://github.com/<USER>/<PROJECT>/releases/latest -O - | egrep '/.*/.*/.*zip' -o)

如果回购只是使用标签而不是发布——参考jQuery——基于一个URL的解决方案是行不通的。

相反,您必须查询所有标记,对它们进行排序并构造下载URL。我为语言Go和jQuery repo实现了这样一个解决方案:链接到Github

也许,这对某些人有帮助。

如果你只想使用curl,你可以尝试使用-w '%{url_effective}',它在重定向链之后打印URL(如果你用-L调用它,后面跟着curl)。举个例子

curl -sLo /dev/null -w '%{url_effective}' https://github.com/github-tools/github/releases/latest

输出https://github.com/github-tools/github/releases/tag/v3.1.0

根据2018-05-23的GitHub支持,不可能

联系support@github.com 2018-05-23,留言:

你能否确认一下,目前除了干扰API,没有别的办法了?

他们回答说:

谢谢你伸出援手。我们建议使用API来获取最新的版本,因为这种方法是稳定的,有文档记录的,并且不会很快改变:

https://developer.github.com/v3/repos/releases/#get-the-latest-release

我也将在:https://github.com/isaacs/github/issues/658继续跟踪这个

没有任何依赖的Python解决方案

健壮、便携:

#!/usr/bin/env python3


import json
import urllib.request


_json = json.loads(urllib.request.urlopen(urllib.request.Request(
'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases/latest',
headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

参见:

还要考虑预发行版

/latest看不到预先发布的版本,但这很容易做到,因为/releases首先显示最新的版本:

#!/usr/bin/env python3


import json
import urllib.request


_json = json.loads(urllib.request.urlopen(urllib.request.Request(
'https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases',
headers={'Accept': 'application/vnd.github.v3+json'},
)).read())
asset = _json[0]['assets'][0]
urllib.request.urlretrieve(asset['browser_download_url'], asset['name'])

晚了几年,但我只是实现了一个简单的重定向来支持https://github.com/USER/PROJECT/releases/latest/download/package.zip。它应该被重定向到最新标记的package.zip发布资产。希望它很方便!

Github现在支持从最新版本https://help.github.com/en/articles/linking-to-releases下载单个文件的静态链接

https://github.com/USER/PROJECT/releases/latest/download/package.zip

这个解决方案的好处是你不需要指定任何版本号或标签号——它只会抓取最新的

测试:

我使用以下Github用户&回购协议:

< p >“< >强f1linux < / >强"= Github用户
< >强pi-ap < / >强"=回购< / p >

repo保存到的任意目录名称设置为:

--one-top-level="pi-ap"

直接:

使用Firefox的“__abc4”;工具(右上角3条),在&;网络"section我发现https://api.github.com被重定向到https://codeload.github.com,所以通过将curl管道到tar,我能够获取最新版本的repo并将其保存为可预测的名称,以便可以对其进行操作:

curl https://codeload.github.com/f1linux/pi-ap/legacy.tar.gz/master | tar xzvf - --one-top-level="pi-ap" --strip-components 1

间接:

在我使用直接 URL实现了最新版本的全自动下载后,我将注意力转向了用Github的重定向实现同样的功能:

curl -L https://api.github.com/repos/f1linux/pi-ap/tarball | tar xzvf - --one-top-level="pi-ap" --strip-components 1

首选的方法:

但是,请注意,根据Von下面的评论,间接首选的方法

进一步验证:

为了确保我的结果可重复到其他版本的Github回购,同样的测试成功执行了Digital Ocean的doctl api工具包(这实际上是整个练习的开始!):

直接间接都可以使用与上面相同的形式,只需要更改用户名&回购协议:

直接:

curl https://codeload.github.com/digitalocean/doctl/legacy.tar.gz/master | tar xzvf - --one-top-level="doctl" --strip-components 1

间接:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1

如果你想在高山中使用,请遵循以下步骤:

 apk add curl ca-certificates wget
wget -q $(curl -s https://api.github.com/repos/<USER>/<REPOSITORY>/releases/latest | grep browser_download_url | grep "$ARCH" | cut -d '"' -f 4)

wget中的-q标志是安静模式。如果你想看到输出,那么不使用-q

这是针对Linux的。

我看到了上面被接受的答案

A few years late, but I just implemented a simple redirect to support https://github.com/USER/PROJECT/releases/latest/download/package.zip. That should redirected to the latest tagged package.zip release asset. Hope it's handy!

约书亚偷看,但注释指出,它不支持版本文件名。

在搜索了一会儿之后,我编写了一个适用于版本化文件名的一行调用。它使用curl获取最新的文件版本,然后使用添加的重定向支持来下载最新版本的文件。

wget $'https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest/download/<FILE NAME START>-'$(curl -s https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest | grep -o -P '(?<=releases/tag/).*(?=\">)')$'<FILE NAME END>'

因此,它在重定向后将目标指向页面https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest上命名为<REPO NAME>-linux64_arm-<VERSION NUMBER>.tar.gz的文件。它通过在curl调用返回的文本中releases/tag/">之间查找<VERSION NUMBER>来实现这一点。因此,在上面的例子中,<FILE NAME START><REPO NAME>-linux64_arm-,而<FILE NAME END>.tar.gz。通过查看https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest使用什么作为其文件命名方案来获得STARThttps://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest0位。

我通过模仿其他人如何使用grep和curl来创建这个,现在才学会所有这些,所以如果它做了一些我甚至无法理解的真正淘气的事情,请告诉我!我也说<UMBRELLA PROJECT>,但用户名应该也能去那里。大声喊出https://stackoverflow.com/a/13245961/2403531的grep调用,https://unix.stackexchange.com/a/10264的$字符串$连接。

这可以在一行代码中完成,如下所示:

$ curl -s https://api.github.com/repos/slmingol/gorelease_ex/releases/latest \
| grep -wo "https.*Linux.*gz" | wget -qi -

这里我们:

  • 拉出GitHub的API端,以获得带有latest标签的发布工件的信息。
  • 解析输出,寻找匹配模式https.*Linux.*gz的工件。
  • 将URL传递给命令wget -qi -,以便下载

为了进一步揭示这里发生了什么,这里有一个更广泛的API端点grep:

$ curl -s https://api.github.com/repos/slmingol/gorelease_ex/releases/latest | grep -wo "https.*" | grep gz
https://github.com/slmingol/gorelease_ex/releases/download/0.0.78/gorelease_ex_0.0.78_Darwin_x86_64.tar.gz"
https://github.com/slmingol/gorelease_ex/releases/download/0.0.78/gorelease_ex_0.0.78_Linux_x86_64.tar.gz"

上面你可以看到匹配的url。

进一步提示

你也可以参数化grep参数,这样它就会“动态地”;确定它是在什么平台上运行的,并基于此替换为适当的字符串。

$ curl -s https://api.github.com/repos/slmingol/gorelease_ex/releases/latest \
| grep -wo "https.*$(uname).*gz" | wget -qi -

这里$(uname)将返回Darwin、Linux等。

简单的命令,工作和下载最新的包可用的github发行版

curl -ks https://api.github.com/repos/<reponame>/releases/latest | grep "browser_download_url.*linux-amd64.tar.gz" | cut -d : -f 2,3 | tr -d \" | xargs wget --no-check-certificate
  • reponame -将其替换为github repo中的可用包 李发布< / >
  • .tar.gz包的类型可以根据需要替换。除 . zip等李< / >