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


当前回答

这可以在一行代码中完成,如下所示:

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

这里我们:

拉出GitHub的API端,以获得带有最新标签的发布构件的信息。 解析输出,寻找与模式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"

上面你可以看到匹配的url。

进一步提示

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

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

这里$(uname)将返回Darwin、Linux等。

其他回答

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

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

这种解决方案的好处是您不必指定任何版本或标记号—它只会抓取LATEST。

测试:

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

“f1linux” = Github用户 “pi-ap” = 存储库

repo保存到的任意目录名称设置为:

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

直接:

使用Firefox的“Web Developer”工具(右上角的3条),在“Network”部分,我发现https://api.github.com重定向到https://codeload.github.com,所以通过管道curl到tar,我能够获取最新版本的repo并将其保存为可预测的名称,以便对其进行操作:

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

首选的方法:

然而,请注意,根据冯的评论,间接是首选的方法

进一步验证:

为了确保我的结果可复制到其他版本的Github reppos,我们成功地为Digital Ocean的doctl api工具包执行了相同的测试(这实际上是整个练习的开始!):

DIRECT和INDIRECT都使用与上面相同的表单,只需更改用户名和repo:

直接:

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

简单的命令,工作和下载最新的包可用的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

Reponame -替换它与github repo与可用的包 释放 可以根据需要替换包的.tar.gz类型。除 . 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);

链接到版本帮助页面确实提到了“最新版本”按钮,但这并没有给你一个下载链接。

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

为此,你需要首先获得最新的标签(如“GitHub URL For最新发布的下载文件?”所述):

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

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