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



使用 GitHub 的发布功能,可以提供下载特定版本已发布软件的链接。但是,每次发布时,gh页面也需要更新。

有没有办法获取指向最新版本软件的特定文件的链接?

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

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

我想要的是这样的:

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

注意:这个问题和 GitHub 最新版本是 这个问题特别要求访问文件, 不是 GitHub 最新版本页面

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

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

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

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

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

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

另一种使用 curl 和 wget 从最新版本页面下载单个二进制文件的 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 禁止错误,则可能能够添加-N以仅下载。

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

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

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

$ 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)将返回达尔文、Linux 等。

只需使用以下网址之一即可下载最新版本:(例如,从BoxBilling Project获取URL(:https://api.github.com/repos/boxbilling/boxbilling/releases

下载最新版本的 zip 格式:https://api.github.com/repos/boxbilling/boxbilling/zipball

下载最新版本的压缩包: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

如前所述,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"

原子释放解决方案

请注意,每个存储库可以有不同的方法来提供所需的工件,因此我将演示一个行为良好的工件,如 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
...

获取所需资产的下载网址

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游乐场

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

安全

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

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

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

根据截至 2018 年 5 月 23 日的 GitHub 支持,无法实现

于2018-05-23联系 support@github.com,并发送消息:

你能确认目前除了弄乱 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'])
链接到

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

https://github.com/reactiveui/ReactiveUI/releases/latest

为此,您需要先获取最新的标签(如"最新版本下载文件的 GitHub URL?

latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)
curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip
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);
如果您

只想使用curl,您可以尝试使用在重定向链后打印 URL 的-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 .

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

我可以将这样的链接添加到我所有存储库的自述文件或 github 页面:


  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>从存储库下载最新版本文件。

  • https://niccokunzmann.github.io/download_latest/<FILE>这是有效的,因为设置了 JavaScript 引用器,并且要下载的存储库是通过 document.referrer 确定的。因此,该链接也适用于分叉。

你可以在这里找到源代码,分叉或只是使用我的存储库。

这是

针对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 调用返回的文本中查找 releases/tag/">之间的<VERSION NUMBER>来实现此目的。所以说得很清楚,<FILE NAME START>是上面例子中的<REPO NAME>-linux64_arm-<FILE NAME END>.tar.gz。通过查看https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest用作其文件命名方案的内容来获取START位和END位。

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

此解决方案的好处是您不必指定任何版本或标签编号 - 它只会获取最新的。

测试:

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

">f1linux" = Github用户
">pi-ap" = 存储库

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

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

直接:

使用 Firefox 的">Web 开发人员"工具(右上角有 3 个栏(,在">网络"部分,我发现https://api.github.com正在重定向到 https://codeload.github.com ,因此通过将curl管道输送到tar,我能够获取最新版本的存储库并将其保存为可预测的名称,以便可以对其进行操作:

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

间接:

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

curl -L https://api.github.com/repos/f1linux/pi-ap/tarball | tar xzvf - --one-top-level="pi-ap" --strip-components 1

首选方法:

但是,请注意,根据Von下面的评论,间接是首选方法

进一步验证:

为了确保我的结果可以重现到其他版本的 Github 存储库,对 Digital Ocean 的 doctl api 工具包成功执行了相同的测试(这实际上是整个练习的开始!

直接间接都使用与上述相同的形式,只需更改用户名和存储库:

直接:

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

间接:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 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 .

如果存储库仅使用标签而不是发布 - 参见jQuery - 基于一个URL的解决方案不起作用。

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

也许,这对某人有帮助。

一个简单的命令,可以工作并下载GitHub版本中可用的最新软件包

curl -ks https://api.github.com/repos/<reponame>/releases/latest | grep "browser_download_url.*linux-amd64.tar.gz" | cut -d : -f 2,3 | tr -d " | xargs wget --no-check-certificate
  • 存储库名称 - 将其替换为 GitHub 存储库,其中包含可用的包释放
  • 包装类型.tar.gz可以根据需要更换。前任-.zip等

有一个使用内部github.com网络服务器latest重定向规则的肮脏技巧。但此规则raw.githubusercontent.com主机上不存在。

例如,我们可以使用以下代码安装最新的可用 nvm:

curl -s -w '%header{location}' "https://github.com/nvm-sh/nvm/releases/latest/download/install.sh" | 
  sed -e 's///github.com///raw.githubusercontent.com/' -e 's//releases/download//' | 
  xargs curl -o- | bash

相关内容

最新更新