使用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最新发布的页面
只需使用下面的网址下载最新版本:
(以boxbilling项目中的url为例):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发布API做一个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。
如前所述,jq对于这个和其他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都可以有不同的方式提供所需的工件,因此我将演示一个表现良好的工件,比如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
...
获取所需资产的下载URL
下面原子-mac是我想要的资产通过jq的选择(.name=="原子-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和gpg下载的工件的有效性。