下载最新的GitHub发布版本

30
我想在我的项目网站上添加一个"下载最新版本"的按钮,该按钮将代表链接到存储在GitHub Releases上的最新发布版本。
我尝试创建一个名为"latest"的发布标签,但当我尝试加载新的发布版本时变得复杂(与标签创建日期混淆、标签互换等)。手动更新我的网站上的下载链接也是一项耗时且繁琐的任务。
请注意,我的网站是静态托管的,所以我无法使用服务器端脚本来生成链接。有什么好的建议吗?
9个回答

24

你不需要任何脚本来生成最新版本的下载链接。只需使用以下格式:

https://github.com/:owner/:repo/zipball/:branch

示例:

https://github.com/webix-hub/tracker/zipball/master
https://github.com/iDoRecall/selection-menu/zipball/gh-pages

如果您想获取包括版本号在内的最新版本下载链接,可以通过获取最新发行版API获得:
GET /repos/:owner/:repo/releases/latest

示例:

$.get('https://api.github.com/repos/idorecall/selection-menu/releases/latest', function (data) {
  $('#result').attr('href', data.zipball_url);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a id="result">Download latest release (.ZIP)</a>


2
如果您需要.tar.gz文件,那么您可以将url中的zipball替换为tarball - scribblemaniac
2
https://api.github.com/repos/jquery/jquery/releases/latest 返回404。这个返回空字符串:https://api.github.com/repos/webix-hub/tracker/releases,而这两个项目都有发布版本。为什么API的行为不一致?有关于此的任何文档吗? - Hamid Sarfraz
1
@HamidSarfraz: 经过GitHub支持的反馈,jquerywebix-hub并没有发布版本,而是有标签,并且最新的发布API与标签不兼容。完整的发布看起来像是这样的 this,如果您想要列出git标签,可以使用https://developer.github.com/v3/repos/#list-tags。 - Dan Dascalescu
1
@DanDascalescu 谢谢。那很有帮助。 - Hamid Sarfraz

18

1
这个方法似乎在我感兴趣的项目中已经失效了。 :( - ThorSummoner
@ThorSummoner:一些项目维护者不费心添加发布版本。在这种情况下,API将返回一个空数组。 - Dan Dascalescu

4

2015年2月18日起,GitHub V3发布API已经有了获取最新发布API

GET /repos/:owner/:repo/releases/latest

另请参阅 "链接到发布版".


仍然,资产的名称可能会让人感到棘手。
例如,Git-for-Windows 需要类似以下的命令:
curl -IkLs -o NUL -w %{url_effective} \
   https://github.com/git-for-windows/git/releases/latest|\
grep -o "[^/]*$"| sed "s/v//g"|\
xargs -I T echo \
  https://github.com/git-for-windows/git/releases/download/vT/PortableGit-T-64-bit.7z.exe \
  -o PortableGit-T-64-bit.7z.exe| \
sed "s/.windows.1-64/-64/g"|sed "s/.windows.\(.\)-64/.\1-64/g"|\
xargs curl -kL

第一行提取最新版本号2.35.1.windows.2
其余部分将构建正确的URL
https://github.com/git-for-windows/git/releases/download/
        v2.35.1.windows.2/PortableGit-2.35.1.2-64-bit.7z.exe
        ^^^^^^^^^^^^^^^^^             ^^^^^^^^^

3

如果您正在尝试从任何Linux(即使是旧版本或小版本)下载文件,或者正在尝试从bash脚本中下载文件,则最可靠的方法是使用以下命令:

wget https://api.github.com/repos/$OWNER/$REPO/releases/latest -O - | awk -F \" -v RS="," '/browser_download_url/ {print $(NF-1)}' | xargs wget

请不要忘记用正确的所有者和存储库名称替换$OWNER和$REPO。该命令将下载一个包含最新版本数据的json页面,然后awk从browser_download_url键获取值。
如果您使用的是非常老的Linux或带有小型wget的小型嵌入式系统,则可能会出现下载名称问题。在这种情况下,您可以始终使用超级可靠的:
URL=$(wget https://api.github.com/repos/$OWNER/$REPO/releases/latest -O - | awk -F \" -v RS="," '/browser_download_url/ {print $(NF-1)}'); wget $URL -O $(basename "$URL")

3
您可以在以下情况下使用:
  • ${Organization} 用作GitHub用户或组织
  • ${Repository} 是存储库名称

curl -L https://api.github.com/repos/${Organization}/${Repository}/tarball > ${Repository}.tar.gz

.tar.gz文件中的顶级目录具有目录名称中的提交sha哈希值,如果您需要自动更改为结果目录并执行某些操作,则可能会出现问题。

以下方法将剥离此内容,并将文件留在具有可预测名称的文件夹中。

mkdir ${Repository} curl -L https://api.github.com/repos/${Organization}/${Repository}/tarball | tar -zxv -C ${Repository} --strip-components=1


2
也许你可以使用一些客户端脚本,并通过调用GitHub API来动态生成链接目标,通过一些JQuery的技巧?
Releases API提供了一种检索所有发布版本的方式。例如,此链接返回一个以Json格式呈现的ReactiveUI项目中所有发布版本的列表。
从其中提取第一个将返回最新的发布版本。
在此有效载荷中:
- `html_url`属性将保存构建URL的第一部分(即`https://github.com/{owner}/{repository}/releases/{version}`)。 - `assets`数组将列出可下载的存档文件。每个资产将具有一个`name`属性。
构建目标下载URL只需要进行几个字符串操作即可实现。
  • 在html_url的releases/段和版本号之间插入download/关键字
  • 添加要下载的资产的名称

生成的URL将采用以下格式:https://github.com/{owner}/{repository}/releases/download/{version}/name_of_asset

例如,针对上面的ReactiveUI链接中的Json负载,我们有html_url: "https://github.com/reactiveui/ReactiveUI/releases/5.99.0"和一个名为name: "ReactiveUI.6.0.Preview.1.zip"的资产。

因此,下载链接是https://github.com/reactiveui/ReactiveUI/releases/download/5.99.0/ReactiveUI.6.0.Preview.1.zip


1
谢谢,你的方法很好,但我不想让用户依赖 JS,因为它可以在用户端轻易地关闭(而使用 <noscript> 标签会带回臃肿的问题)。 - kefir500
https://gist.github.com/ambrosechua/d426ac039e0a5f09059c 是一个快速草稿脚本,但仅适用于发布版本而不是源代码下载。 - ambrosechua

1

1
如果你正在使用PHP,请尝试以下代码:
function getLatestTagUrl($repository, $default = 'master') {
    $file = @json_decode(@file_get_contents("https://api.github.com/repos/$repository/tags", false,
        stream_context_create(['http' => ['header' => "User-Agent: Vestibulum\r\n"]])
    ));

    return sprintf("https://github.com/$repository/archive/%s.zip", $file ? reset($file)->name : $default);
}

功能使用示例
echo '<a href="' .getLatestTagUrl('OzzyCzech/vestibulum') .'">Download</a>';

2
很遗憾,GitHub Pages 服务不支持PHP。 - kefir500

0

正如@Dan Dascalescu 在接受答案的评论中指出的那样,有些项目(大约30%)不会费心提交正式发布,因此“最新版本”按钮和/ releases / latest API 调用都无法返回有用的数据。

为了可靠地获取GitHub项目的最新版本,您可以使用 lastversion


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接