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

Is there a link to GitHub for downloading a file in the latest release of a repository?

使用Github的发布特性,可以提供一个链接来下载发布软件的特定版本。但是,每次发布时,GH页面也需要更新。

有没有一种方法可以链接到某个软件的最新版本的特定文件?

例如,这是一个静态链接:

https://github.com/USER/PROJECT/releases/download/v0.0.0/package.zip

我想要的是:

江户十一〔一〕号

NOTE: The difference between this question and
GitHub latest release is
that this question specifically asks for getting access to the file,
not the GitHub latest release page


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

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


您可以使用GitHub版本API执行Ajax请求以获取最新版本的下载URL。它还显示发布时间和下载计数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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();

1
2
3
4
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
Download
<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


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

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


另一个Linux解决方案使用curl和wget从最新发布的页面下载单个二进制文件

1
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 '...'使用regex查找所需的文件

wget --base=http://github.com/ -i -将管道的相对路径转换为绝对URL

-O scollector设置所需的文件名。

可能只能在文件较新但S3给出403禁止错误的情况下添加-N以进行下载。


如前所述,JQ对于这个和其他RESTAPI很有用。

tl;dr-更多详细信息如下

假设您想要MacOS版本:

1
2
3
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这样的行为良好的工件。

获取已发布资产的名称

1
2
3
4
5
6
7
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")所期望的资产。

1
2
3
4
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

。下载工件

1
curl -LO"https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip"

JQ操场

JQ语法可能很困难。这里有一个试验上述jq的操场:网址:https://jqplay.org/s/h6-lfoehlz

安全

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


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

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


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


只需使用以下URL之一下载最新版本:(以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

单击其中一个URL立即下载最新版本。我写这行的时候,它现在是:boxbilling-boxbilling-4.20-30-g452ad1c[.zip/.tar.gz]

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


根据Github支持,从2018-05-23起是不可能的

2018-05-23联系[email protected],消息:

Can you just confirm that there is no way besides messing with API currently?

他们回答说:

Thanks for reaching out. We recommend using the API to fetch the latest release because that approach is stable, documented, and not subject to change any time soon:

https://developer.github.com/v3/repos/releases/#get-the-latest-release

我还将在以下网址进行跟踪:https://github.com/isaacs/github/issues/658

没有任何依赖关系的python解决方案

坚固轻便:

1
2
3
4
5
6
7
8
9
10
11
#!/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获取的最快方法是什么?
  • 基本的HTTP文件下载和保存到python中的磁盘?

同时考虑预发布

/latest没有看到预发布,但很容易做到,因为/releases首先显示了最新的版本:

1
2
3
4
5
6
7
8
9
10
11
#!/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'])

链接到Releases帮助页面确实提到了"最新版本"按钮,但这并不能为您提供下载链接。

https://github.com/reactiveui/reactiveui/releases/latest/最新版本

为此,您需要首先获取最新的标签(如"下载文件的最新版本的github url?"中所述)。:

1
2
3
latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip


如果您只想使用curl,您可以尝试使用-w '%{url_effective}',它在重定向链后打印URL(如果使用-L调用URL,则后面跟着curl)。所以,举个例子

1
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


在php中-重定向到最新版本的下载。只需放在你的网站上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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);

我想从存储库描述中的README.md文件下载版本。在那里,我不能执行javascript。

我可以向所有存储库的自述文件或Github页面添加如下链接:

  • 埃多克斯1〔8〕从存储库中下载最新的版本文件。
  • 埃多克斯1〔9〕这是因为设置了javascript引用,并且要下载的存储库是通过document.referrer确定的。因此,链接也适用于叉。

您可以在这里找到源代码,fork或只是使用我的repo。


如果repo只是使用标签而不是发布(参见jquery),那么基于一个URL的解决方案将不起作用。

相反,您必须查询所有标记,对它们进行排序并构造下载URL。我为语言go和jquery repo实现了这样一个解决方案:链接到github。

也许,这对某人有帮助。