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


当前回答

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

其他回答

你可以使用GitHub发布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。

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

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

参见:

在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'])

这种解决方案的好处是您不必指定任何版本或标记号—它只会抓取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

如果你想在alpine中使用,请遵循以下步骤:

 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的参数。

使用curl和jq从命令行检索最新版本的第一个文件:

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