URL-адрес GitHub для последней версии файла _download_?

Несмотря на то, что этот вопрос похож на последний выпуск GitHub, он совсем другой - он касается ссылки, которая означает "последняя версия самого файла загрузки".

GitHub предоставляет "Последний" URL-адрес, который перенаправляет на страницу информации для последней версии. Например: https://github.com/reactiveui/ReactiveUI/releases/latest будет перенаправляться на https://github.com/reactiveui/ReactiveUI/releases/tag/5.99.6 (как я набираю это, или на страницу для более новой версии, когда-нибудь).

Это здорово, но мне нужен URL-адрес самого загружаемого файла. В этом примере .zip файл, связанный с зеленой кнопкой загрузки, https://github.com/reactiveui/ReactiveUI/releases/download/5.99.6/ReactiveUI-5.99.6.zip (по мере того как я набираю это или в новый zip файл, когда-нибудь).

Почему? Я хочу, чтобы URL-адрес зависал, как часть Travis CI script, для загрузки последней версии.

Я догадался по нескольким URL-адресам, например /releases/download/ latest/file.zip(заменяя "последний" для части версии) и /releases/download/file.zip, но те, которые указаны в 404.

Есть ли способ сделать это - в контексте оболочки script и curl (обратите внимание: не на странице браузера с JS)?

Ответ 1

Как отметил @florianb, я должен использовать git.

Первоначально мой .travis.yml был чем-то вроде:

before_install:
- curl -L https://raw.githubusercontent.com/greghendershott/travis-racket/master/install-racket.sh | bash

Это автоматически получит любую последнюю версию из репо.

Но кто-то указал мне, что GitHub не хочет, чтобы люди использовали raw.github.com для загрузки. Вместо этого люди должны использовать "релизы". Таким образом, я был хорошим помощником и вручную делал выпуск каждый раз. Тогда мой .travis.yml был чем-то вроде:

before_install:
- curl -L https://github.com/greghendershott/travis-racket/releases/download/v0.6/install-racket.sh | bash

Но это PITA, чтобы делать релиз каждый раз. Хуже того, все файлы .travis.yml необходимо обновить, чтобы указать на более новую версию файла.

Вместо этого просто используйте git для клонирования репо и используйте файл внутри него:

before_install:
- git clone https://github.com/greghendershott/travis-racket.git
- cat travis-racket/install-racket.sh | bash # pipe to bash not sh!

Ответ 2

Вот способ сделать это без Github, если в релизе есть одна загрузка:

wget $(curl -s https://api.github.com/repos/USERNAME/REPONAME/releases/latest | grep 'browser_' | cut -d\" -f4)

Это довольно легко (хотя и не очень), и, конечно же, вы можете поменять wget на другой вызов curl, если хотите передать его чему-то.

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

Ответ 3

Очень интересно, я еще не заметил "последнего" тега в GitHub-релизах. Как я понял, они выдаются, если вы используете "предварительную версию" - возможности системы выпуска GitHubs. Но я не знаю, как получить доступ к двоичным файлам через последний путь.

Я хотел бы предложить вам использовать git (который доступен в вашем travis-vm) для загрузки последнего тега.

Как и Жюльен Рено описывает в своем блоге post, вы сможете проверить последний тег в репозитории следующим образом:

# this step should be optional
git fetch --tags

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

Это решение основано на предположении, что последний тег также является последней версией.

Ответ 4

Я использую это, чтобы получить URL загрузки в PowerShell 5+ (замените ACCOUNT и REPO)

Invoke-RestMethod -uri  https://api.github.com/repos/ACCOUNT/REPO/releases/latest | select -ExpandProperty assets | select -expand browser_download_url 

Обратите внимание, что если у них более одного пакета, это будет список. Если вы хотите выбрать определенную часть, найдите уникальную часть имени, то есть выиграйте для Windows и используйте: (замените ACCOUNT, REPO и SELECTOR)

Invoke-RestMethod -uri  https://api.github.com/repos/ACCOUNT/REPO/releases/latest | select -ExpandProperty assets | ? { $_.name.Contains("SELECTOR")} | select -expand browser_download_url

В качестве бонуса, если вы назначили вышеперечисленное значение переменной, вы можете захватить файл и извлечь его следующим образом (при условии, что вы назначаете $uri):

Invoke-WebRequest $uri -OutFile "release.zip"
Expand-Archive .\release.zip

В PowerShell 6+ это должно работать на других платформах, чем Windows.

Ответ 5

В окнах, используя только powershell, это работает для меня. Вероятно, это может быть написано намного короче.

#Downloads latest paket.bootstrapper.exe from github
$urlbase = "https://github.com"
$latestPage="$urlbase/fsprojects/Paket/releases/latest"
Write-Host "Parsing latest release page: $latestPage"
$page=Invoke-Webrequest -uri $latestPage
$latestBootStrapper=($page.Links | Where-Object { $_.href -match "bootstrapper" }).href

$dlurl="$urlbase$latestBootStrapper"
Write-Host "Downloading paket.bootstrapper.exe from $dlurl"

$wc=new-object net.webclient
$wc.UseDefaultCredentials=$true
$wc.Proxy.Credentials=$wc.Credentials
$wc.DownloadFile($dlurl, (join-path (resolve-path ".\") "paket.bootstrapper.exe"))