Есть ли ссылка на GitHub для загрузки файла в последнем выпуске репозитория?

137

Используя функцию выпуска 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.

Кристиан Рондо
источник
1
Теперь это изначально поддерживается Github (с небольшой разницей в формате URL). См stackoverflow.com/questions/24987542/...
wisbucky

Ответы:

38

Несколько лет спустя, но я просто реализовал простое перенаправление в службу поддержки https://github.com/USER/PROJECT/releases/latest/download/package.zip. Это должно быть перенаправлено на последний помеченный package.zipрелиз актива. Надеюсь, это удобно!

Джошуа Пик
источник
2
Задокументировано на help.github.com/en/articles/linking-to-releases : если вы хотите напрямую связать загрузку вашего последнего релиза, вы можете сделать ссылку на / owner / name / Releases / latest / download / asset -name.zip
Лиам
4
Однако было бы полезно, если бы эта функция работала с версионными именами активов.
Лиам
3
Обратите внимание, что порядок переключается .../releases/latest/download/...против .../releases/download/v0.0.0/.... Вы не можете просто заменить v0.0.0с latestна месте.
Висбуки
2
@Joshua Peek Может быть, вы могли бы расширить это, чтобы расширить "LATEST" в имени ресурса, чтобы быть строкой версии? Это сделало бы его полезным для ресурсов с номерами версий в их названии.
JWATT
Как насчет загрузки последней версии исходного кода? Как называется актив в этом случае?
скд
59

Решение Linux для получения ссылки на загрузку последнего релиза (работает только в том случае, если релиз имеет только один актив)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
Путна
источник
7
Один дополнительный grep в конвейере найдет файл для вашего дистрибутива и архитектуры. Для атомного текстового редактора на 64-битной Ubuntu:curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
hobs
3
Там нет browser_download_url больше. Вы можете использовать tarball_url сейчас. curl -s https://api.github.com/repos/git-ftp/git-ftp/releases | grep tarball_url | head -n 1 | cut -d '"' -f 4
Майкл
4
@maikel grepping для browser_download_url все еще работает для меня.
Лео Лам
@ léo-lam Вы правы. Если у вас нет ресурсов, вы можете использовать tarball_url для получения исходного кода.
Майкл
Вы можете загрузить только последний выпуск, чтобы избежать | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck
29

Вы можете сделать ajax- запрос для получения последней версии URL загрузки, используя GitHub Releases API . Это также показывает, когда это было выпущено и количество загрузок:

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>

Для вас важно установить 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

Jaex
источник
Прохладно. Вы знаете, почему это может не сработать? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Вольт
Потому что у тебя нет релиза. Проверьте: api.github.com/repos/DataTables/DataTables/releases
Jaex
В стиле фанк ... github.com/DataTables/DataTables/releases показывает кучу релизов. Там должна быть некоторая двусмысленность там.
Вольт
Нет, это только теги. Там нет релизов.
MrD
2
github.com/jquery/jquery/releases, у них нет никаких выпусков. Это просто теги версий.
Jaex
15

Из командной строки, используя curlи jq, получает первый файл последней версии:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'
IanB
источник
1
jq --raw-outputэто более чистый способ бросить цитаты. Если вы хотите только последнюю версию, ее дешевле получить .../releases/latestи выбросить .[0] | . Но выбор всех выпусков позволяет такие запросы, как jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Бени Чернявский-Паскин
Спасибо, Бени, я подробно остановился на том, что взял последний докер-композитор curl --silent "https://api.github.com/repos/docker/compose/releases/latest" | jq --arg PLATFORM_ARCH "$(echo `uname -s`-`uname -m`)" -r '.assets[] | select(.name | endswith($PLATFORM_ARCH)).browser_download_url' | xargs sudo curl -L -o /usr/local/bin/docker-compose --url . Концы с магией, и использование арки позволяет мне игнорировать файлы what.sha256, которые обычно присутствуют без каких-либо действий |head -n 1.
dragon788
8

Другое решение 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 '...' использует регулярные выражения, чтобы найти нужный файл

wget --base=http://github.com/ -i - преобразует относительный путь из конвейера в абсолютный URL

и -O scollectorустанавливает желаемое имя файла.

может быть в состоянии добавить -Nтолько для загрузки, если файл более новый, но S3 выдавал ошибку 403 Forbidden.

Грег Брей
источник
3
Моя цель - сделать ссылку на сайт, который всегда указывает на последнюю версию. Команда Linux не позволит этого.
Кристиан Рондо
1
Это то, что я искал, но вы должны убедиться, что у вас есть правильные escape-символы для подстановочных знаков и точек при использовании grep.
Т. Томас
@TdotThomas спасибо, это подсказка, которая мне понадобилась, чтобы номера выпусков вышли из периодов, \.например, 2.2.0/download/[0-9\.]*/
Джефф Пукетт
Нет, это не так. Нет побег чарс. Но я бы предположил необязательный vпрефикс, как тег v0.11.0. Просто curl -s -L https://github.com/bosun-monitor/bosun/releases/latest | egrep -o '/bosun-monitor/bosun/releases/download/[v]?[0-9.]*/scollector-linux-armv6' | wget --base=http://github.com/ -i - -O scollectorвведите свой CLI, и он отлично работает. Спасибо, Грег!
MS
7

Как отмечалось ранее, 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 мой любимый актив с помощью JQselect(.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)
Рольф
источник
6

Просто используйте один из приведенных ниже URL-адресов, чтобы загрузить последнюю версию: (например, URL-адреса из проекта boxbilling): 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

Lahmizzar
источник
4
те сделки РЕПО не высвобождает
качается
5

Не возможно в соответствии с поддержкой GitHub на 2018-05-23

Связаться с 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'])

Смотрите также:

Также рассмотрите предварительные выпуски

/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'])
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
3

На странице справки « Ссылка на релизы» упоминается кнопка «Последний выпуск», но это не дает вам ссылку для скачивания.

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
VonC
источник
2
Это все еще требует выдвигать новую версию gh-pagesветви каждый раз, когда выпускается новая версия; цель состоит в том, чтобы иметь статическую ссылку, которую я могу использовать, чтобы просто "обратиться к последней версии". Прямо сейчас мой лучший вариант - просто обратиться к странице релизов.
Кристиан Рондо,
@ChristianRondeau Я согласен. Я нигде в API не видел способа ссылаться на полный URL-адрес архива «последней» версии.
VonC
Тем не менее, спасибо за совет; если не получится лучшего ответа, я, вероятно, в конечном итоге сделаю скрипт для обновления gh-страниц, используя ваш скрипт.
Кристиан Рондо
2

в 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);
Alex
источник
2

Если вы хотите использовать просто, curlвы можете попробовать -w '%{url_effective}'распечатать URL-адрес после цепочки перенаправления (за которым следует curl, если вы вызываете его с помощью -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.

Mapio
источник
2

Github теперь поддерживает статические ссылки для загрузки отдельных файлов из последней версии: https://help.github.com/en/articles/linking-to-releases.

https://github.com/USER/PROJECT/releases/latest/download/package.zip
Калоян Раев
источник
Тот же ответ был опубликован 6 месяцами ранее: stackoverflow.com/questions/24987542/…
wisbucky
Спасибо за то, что обратили на это мое внимание @wisbucky, тогда я отклонил его, так как это звучало как пользовательская реализация от разработчика, а не от StackOverflow!
Кристиан Рондо
2

Как и большинство читателей этого вопроса, я был совершенно разочарован тем, что нашел способ полностью автоматизировать загрузку ПОСЛЕДНЕГО версионного релиза или репозитория в Github. Преимущество этого решения в том, что вам не нужно указывать какой-либо выпуск или номер тега - оно просто захватит ПОСЛЕДНИЕ .

Я провел тестирование с использованием следующего пользователя и репозитория Github:

" f1linux " = пользователь Github
" pi-ap " = репо

Произвольное имя каталога, в котором хранится репо, задается в:

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

НЕПОСРЕДСТВЕННЫЙ:

Использование «Firefox в Web Developer » инструментов (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

Предпочитаемый метод:

Тем не менее, обратите внимание, согласно комментарию Вона ниже, что INDIRECT является предпочтительным методом

Дальнейшая проверка:

Чтобы мои результаты можно было воспроизвести для других версий Github-репозиториев, те же тесты были успешно выполнены для doctlapi-инструментария Digital Ocean (именно с этого и началось все упражнение!):

И DIRECT, и INDIRECT работают, используя ту же форму, что и выше, просто меняя имя пользователя и репо:

НЕПОСРЕДСТВЕННЫЙ:

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
F1Linux
источник
Интересный. Upvoted. Я не знал о загрузке кода, хотя все еще рекомендуется использовать API: stackoverflow.com/a/60198721/6309
VonC
Первоначально я столкнулся с горем из-за перенаправления, и, как отмечалось в ответе, инструменты «Веб-разработчика» Firefox заставили меня пойти по правильному пути. Не мог остановиться, хотя, должен был заставить это работать с перенаправлением. Спасибо за отзыв- самые благодарные!
F1Linux
1
@VonC Просто добавил свой отзыв к ответу. Я совершенно не знал об этом. Спасибо за указание на это!
F1Linux
1

Я хочу скачать релизы из README.mdфайла в описании репозитория. Там я не могу выполнить JavaScript.

Я могу добавить такие ссылки в файл README или на страницы github для всех моих репозиториев:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Загружает последний файл релиза из репозитория.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Это работает, потому что установлен реферер JavaScript и через него определяется хранилище для загрузки document.referrer. Таким образом, ссылка также будет работать для вилок.

Вы можете найти исходный код здесь , разветвить или просто использовать мой репозиторий.

пользователь
источник
1
Это довольно умная идея :) она не будет работать, когда вы делитесь ссылками или используете curl или лайки, но эта идея может быть реализована на страницах github проекта.
Кристиан Рондо,
1
Так как это возможно как веб-сайт JavaScript, можно также написать сервис, который выполняет перенаправление. download-service.com/organization/repository/artifact
пользователь
0

В случае, если в репо используются только теги вместо релиза - ср. jQuery - решения, основанные на одном URL, не работают.

Вместо этого вам нужно запросить все теги, отсортировать их и создать URL для загрузки. Я реализовал такое решение для языка Go и репозитория jQuery: ссылка на Github .

Возможно, это кому-то поможет.

SommerEngineering
источник