使用GitHub's Release feature,可以提供下载特定版本的已发布软件的链接。但是,每次发布时,都需要更新gh页面。
有没有办法获得任何最新版软件的特定文件的链接?
例如,这将是一个静态链接:
https://github.com/USER/PROJECT/releases/download/v0.0.0/package.zip
我想要的是:
https://github.com/USER/PROJECT/releases/download/latest/package.zip
注意:此问题与GitHub latest release之间的区别在于此问题专门要求访问该文件,而不是GitHub最新发布页面
您可以使用ajax执行GitHub Releases API请求以获取最新版本下载URL。它还显示它何时发布以及下载次数:
function GetLatestReleaseInfo() {
$.getJSON("https://api.github.com/repos/ShareX/ShareX/releases/latest").done(function(release) {
var asset = release.assets[0];
var downloadCount = 0;
for (var i = 0; i < release.assets.length; i++) {
downloadCount += release.assets[i].download_count;
}
var oneHour = 60 * 60 * 1000;
var oneDay = 24 * oneHour;
var dateDiff = new Date() - new Date(asset.updated_at);
var timeAgo;
if (dateDiff < oneDay) {
timeAgo = (dateDiff / oneHour).toFixed(1) + " hours ago";
} else {
timeAgo = (dateDiff / oneDay).toFixed(1) + " days ago";
}
var releaseInfo = release.name + " was updated " + timeAgo + " and downloaded " + downloadCount.toLocaleString() + " times.";
$(".download").attr("href", asset.browser_download_url);
$(".release-info").text(releaseInfo);
$(".release-info").fadeIn("slow");
});
}
GetLatestReleaseInfo();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="download" href="https://github.com/ShareX/ShareX/releases/latest">Download</a>
<p class="release-info"></p>
将默认按钮URL设置为版本页面(如https://github.com/ShareX/ShareX/releases/latest)非常重要,因此如果浏览器不支持ajax(或javascript)或者访问URL太慢,则下载按钮仍然有效。
当Ajax请求完成时,此按钮的URL将自动更改为直接下载URL。
编辑:
我还制作了一个下载页面,其中显示了您可以在此处找到的多个版本:https://getsharex.com/downloads/
它的源代码:https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js
Linking to releases帮助页面确实提到了“最新版本”按钮,但这并没有为您提供下载链接。
https://github.com/reactiveui/ReactiveUI/releases/latest
为此,您需要先获取最新的标记(如“GitHub URL for latest release of the download file?”中所述):
latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)
curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip
在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);
如果你只想使用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
。
我想从存储库描述中的README.md
文件下载这些版本。在那里,我无法执行JavaScript。
我可以将这些链接添加到我的所有存储库的README文件或github页面中:
https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
从存储库下载最新版本文件。https://niccokunzmann.github.io/download_latest/<FILE>
这是有效的,因为JavaScript referrer已设置,要下载的存储库是通过document.referrer
确定的。因此,该链接也适用于叉子。你可以找到源代码here,fork或者只是使用我的repo。
如果repo只使用标签而不是发布 - 参见jQuery - 基于一个URL的解决方案不起作用。
相反,您必须查询所有标记,对它们进行排序并构建下载URL。我为Go语言和jQuery repo实现了这样的解决方案:Link to Github。
也许,这有助于某人。
获取最新版本资产下载链接的Linux解决方案(仅当发布只有一个资产时才有效)
curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
从命令行使用curl
和jq
,检索最新版本的第一个文件:
curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
jq --raw-output '.assets[0] | .browser_download_url'
使用curl和wget从latest release page下载单个二进制文件的另一个Linux解决方案
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 '...'
使用正则表达式来查找所需的文件
wget --base=http://github.com/ -i -
将管道的相对路径转换为绝对URL
和-O scollector
设置所需的文件名。
或许可以添加-N
只在文件较新但是S3发出403 Forbidden错误时才下载。
几年后,我只是实施了一个简单的重定向来支持https://github.com/USER/PROJECT/releases/latest/download/package.zip
。这应该重定向到最新标记的package.zip
发布资产。希望它方便!
假设你想要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可以有不同的方式来提供所需的工件,所以我将演示一个像atom这样表现良好的人。
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
...
在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
如果可能的话,您应该采取措施确保通过sha256sum and gpg下载的工件的有效性。
使用(内部)wget获取HTML内容的解决方案,为zip文件(使用egrep)过滤它,然后下载zip文件(使用外部wget)。
wget https://github.com/$(wget https://github.com/<USER>/<PROJECT>/releases/latest -O - | egrep '/.*/.*/.*zip' -o)
只需使用下面的其中一个网址下载最新版本:(例如,从boxbilling项目获取网址):https://api.github.com/repos/boxbilling/boxbilling/releases
以zip:https://api.github.com/repos/boxbilling/boxbilling/zipball下载最新版本
下载最新版本的tarball:https://api.github.com/repos/boxbilling/boxbilling/tarball
点击其中一个网址即可立即下载最新版本。正如我写的那样,它目前是:boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]
更新:在我的日志文件中找到另一个URL(参见上面的例子)https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master
根据GitHub对2018-05-23的支持,这是不可能的
联系[email protected]于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'])