Есть ли ссылка на GitHub для загрузки файла в последней версии репозитория?
Используя функцию GitHub Release, можно указать ссылку для загрузки определенной версии опубликованного программного обеспечения. Тем не менее, каждый раз, когда выполняется релиз, 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
Ответы
Ответ 1
Несколько лет спустя, но я просто внедрил простое перенаправление для поддержки https://github.com/USER/PROJECT/releases/latest/download/package.zip
. Это должно быть перенаправлено на последний помеченный ресурс package.zip
. Надеюсь, это удобно!
Ответ 2
Linux-решение для получения последней ссылки на ссылку для доступа к релизу (работает только в том случае, если релиз имеет только один актив)
curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
Ответ 3
Вы можете сделать ajax- запрос, чтобы получить URL-адрес последней загрузки, используя API GitHub Releases. Это также показывает, когда это было выпущено и количество загрузок:
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>
Ответ 4
В командной строке с помощью curl
и jq
извлекается первый файл последней версии:
curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
jq --raw-output '.assets[0] | .browser_download_url'
Ответ 5
Другое решение для Linux, использующее curl и wget для загрузки одного двоичного файла с последней версии
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
задает желаемое имя файла.
может добавить -N
только для загрузки, если файл новее, но S3 давал 403 запретную ошибку.
Ответ 6
Как отмечалось ранее, jq полезен для этого и других API REST.
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"
Решение для атомных релизов
Обратите внимание, что в каждом репо могут быть разные способы предоставления нужного артефакта, поэтому я продемонстрирую для хорошо себя ведущего, такого как атом.
Получить имена активов опубликованы
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 Детская площадка
Синтаксис JQ может быть сложным. Вот площадка для экспериментов с jq
выше: https://jqplay.org/s/h6_LfoEHLZ
Безопасность
Вы должны принять меры, чтобы обеспечить достоверность загруженного артефакта через sha256sum и gpg, если это вообще возможно.
Ответ 7
Решение, использующее (внутренний) wget для получения содержимого HTML, отфильтруйте его для zip файла (с помощью egrep), а затем загрузите zip файл (с помощью внешнего wget).
wget https://github.com/$(wget https://github.com/<USER>/<PROJECT>/releases/latest -O - | egrep '/.*/.*/.*zip' -o)
Ответ 8
Просто используйте один из URL-адресов ниже, чтобы загрузить последнюю версию:
(например, взял 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
Ответ 9
Не возможно в соответствии с поддержкой GitHub на 2018-05-23
Связаться с [email protected] 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'])
Ответ 10
В ссылка на релизы на странице справки упоминается кнопка "Последний выпуск", но это не дает вам ссылку для загрузки.
https://github.com/reactiveui/ReactiveUI/releases/latest
Для этого вам нужно сначала получить последний тег (как указано в URL-адрес GitHub для последней версии файла загрузки?"):
latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)
curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip
Ответ 11
в 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);
Ответ 12
Если вы хотите использовать только curl
, вы можете попробовать с помощью -w '%{url_effective}'
, который печатает URL-адрес после цепочки перенаправления (за которым следует завиток, если вы вызываете его с помощью -L
). Итак, например
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
.
Ответ 13
Github теперь поддерживает статические ссылки для загрузки отдельных файлов из последней версии: https://help.github.com/en/articles/linking-to-releases
https://github.com/USER/PROJECT/releases/latest/download/package.zip
Ответ 14
Я хочу скачать релизы из файла README.md
в описании репозитория. Там я не могу выполнить JavaScript.
Я могу добавить такие ссылки в файл README или на страницы github для всех моих репозиториев:
-
https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
Загружает последний файл релиза из репозитория. -
https://niccokunzmann.github.io/download_latest/<FILE>
Это работает, потому что установлен реферер JavaScript, а хранилище для загрузки определяется через document.referrer
. Таким образом, ссылка также будет работать для вилок.
Вы можете найти исходный код здесь, разветкить или просто использовать мой репозиторий.
Ответ 15
В случае, если репо использует только теги вместо выпуска - ср. jQuery - решения, основанные на одном URL-адресе, не работают.
Вместо этого вам нужно запросить все теги, отсортировать их и создать URL-адрес загрузки. Я реализовал такое решение для языка Go и jQuery repo: Ссылка на Github.
Возможно, это помогает кому-то.