使用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最新发布的页面
另一个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(在执行重定向之后)
鹭-o '…'使用正则表达式找到你想要的文件
wget——base=http://github.com/ -i将管道的相对路径转换为绝对URL
和-O sccollector设置所需的文件名。
如果文件更新,可以添加-N到下载,但S3给出了403禁止错误。
根据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'])
参见:
在Python中获取HTTP GET的最快方法是什么?
基本的http文件下载和保存到磁盘在python?
还要考虑预发行版
/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'])
这可以在一行代码中完成,如下所示:
$ curl -s https://api.github.com/repos/slmingol/gorelease_ex/releases/latest \
| grep -wo "https.*Linux.*gz" | wget -qi -
这里我们:
拉出GitHub的API端,以获得带有最新标签的发布构件的信息。
解析输出,寻找与模式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等。