是否有一个指向GitHub的链接,用于在最新版本的存储库中下载文件?

时间:2014-07-28 01:59:15

标签: github download release github-pages

使用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最新发布页面

19 个答案:

答案 0 :(得分:57)

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

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

答案 1 :(得分:29)

您可以使用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

答案 2 :(得分:15)

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

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

答案 3 :(得分:8)

使用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设置所需的文件名。

如果文件较新但是S3发出403 Forbidden错误,

可能只能添加-N才能下载。

答案 4 :(得分:7)

如前所述,jq对此和其他REST APIs非常有用。

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"

原子释放的解决方案

注意每个回购都可以有不同的方式来提供所需的工件,因此我将演示一个表现良好的回复,如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

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 Playground

jq语法可能很难。这是一个试验上面jq的游乐场: https://jqplay.org/s/h6_LfoEHLZ

安全

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

答案 5 :(得分:6)

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

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

答案 6 :(得分:5)

只需使用以下网址之一下载最新版本: (例如,从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]

更新:在我的日志文件中找到另一个网址(参见上面的示例) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master

答案 7 :(得分:5)

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

答案 8 :(得分:4)

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

联系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'])

答案 9 :(得分:3)

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

答案 10 :(得分:2)

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);

答案 11 :(得分:2)

如果您只想使用curl,可以尝试使用-w '%{url_effective}'在重定向链后打印网址(如果您使用-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

答案 12 :(得分:2)

Github现在支持静态链接,用于从最新版本的https://help.github.com/en/articles/linking-to-releases

中下载单个文件。
https://github.com/USER/PROJECT/releases/latest/download/package.zip

答案 13 :(得分:2)

就像大多数访问此问题的人一样,我对找到一种方法可以完全自动下载 LATEST 版本发布或Github中的仓库感到非常沮丧。此解决方案的好处是您不必指定任何发行版或标签号-它只需获取 LATEST

我使用以下Github用户和仓库进行了测试:

f1linux ” = Github用户
pi-ap ” =回购

将存储库保存到的任意目录名称设置为:

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

直接:

使用Firefox的“ Web开发人员”工具(右上角3个栏),在“ 网络”部分中,我发现https://api.github.com重定向到了{ {1}},因此通过将https://codeload.github.com输送到curl,我能够获取最新版本的存储库并将其保存为可预测的名称,以便可以在以下位置进行操作:

tar

间接:

使用 DIRECT URL实现最新版本的完全自动化下载后,我将注意力转向通过Github重定向实现相同的目的:

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

首选方法:

不过,请注意,根据冯在下面的评论,间接preferred method

进一步验证:

为确保我的结果可与其他版本的Github存储库重复使用,已成功为Digital Ocean的curl -L https://api.github.com/repos/f1linux/pi-ap/tarball | tar xzvf - --one-top-level="pi-ap" --strip-components 1 api工具包执行了相同的测试(实际上是整个练习的开始!):

直接直接都使用与上述相同的形式,只是更改了用户名和仓库:

直接:

doctl

间接:

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

答案 14 :(得分:2)

这可以在一个单行中完成,如下所示:

$ 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"

您可以在上方看到匹配的网址。

进一步提示

您还可以参数化 grep 参数,以便它“动态地”确定它在哪个平台上运行,并基于此替换为适当的字符串。

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

此处 $(uname) 将返回 Darwin、Linux 等。

答案 15 :(得分:1)

我想从存储库描述中的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或只使用我的仓库。

答案 16 :(得分: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的情况下使用

答案 17 :(得分:1)

这是针对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!

Joshua Peek发表,但有评论指出它不支持版本控制的文件名。

搜索了一下之后,我进行了一个单行调用,该调用适用于版本化文件名。它使用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>'

因此,它的目标是重定向后位于网页<REPO NAME>-linux64_arm-<VERSION NUMBER>.tar.gz上的名为https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest的文件。它通过在curl调用返回的文本中寻找<VERSION NUMBER>releases/tag/之间的">来实现此目的。因此,实际上,<FILE NAME START><REPO NAME>-linux64_arm-,而<FILE NAME END>.tar.gz。通过查看START用作文件命名方案的方式,获得ENDhttps://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest位。

我通过模仿其他人如何使用grep和curl来弥补了这一点,现在才学到了所有这些内容,所以让我知道它是否在做一些真正的顽皮的事情,我什至都不懂!我也是在说<UMBRELLA PROJECT>,但用户名也应该可以到那里去。对grep调用大喊https://stackoverflow.com/a/13245961/2403531,对$ string $ concatenation大喊https://unix.stackexchange.com/a/10264

答案 18 :(得分:0)

如果repo只使用标签而不是release - cf. jQuery - 基于一个URL的解决方案不起作用。

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

也许,这有助于某人。