Gibt es einen Link zu GitHub zum Herunterladen einer Datei in der neuesten Version eines Repositorys?

137

Mit der Release-Funktion von GitHub können Sie einen Link zum Herunterladen einer bestimmten Version der veröffentlichten Software bereitstellen. Jedes Mal, wenn eine Veröffentlichung erfolgt, muss die Gh-Seite jedoch ebenfalls aktualisiert werden.

Gibt es eine Möglichkeit, einen Link zu einer bestimmten Datei der neuesten Version einer Software zu erhalten?

Dies wäre beispielsweise eine statische Verknüpfung:

https://github.com/USER/PROJECT/releases/download/v0.0.0/package.zip

Was ich möchte, ist so etwas wie:

https://github.com/USER/PROJECT/releases/download/latest/package.zip

HINWEIS: Der Unterschied zwischen dieser Frage und der neuesten Version von GitHub besteht darin, dass in dieser Frage speziell nach dem Zugriff auf die Datei gefragt wird, nicht auf die Seite mit der neuesten Version von GitHub

Christian Rondeau
quelle
1
Dies wird jetzt von Github nativ unterstützt (mit einem kleinen Unterschied im URL-Format). Siehe stackoverflow.com/questions/24987542/…
wisbucky

Antworten:

37

Ein paar Jahre zu spät, aber ich habe gerade eine einfache Weiterleitung implementiert, um zu unterstützen https://github.com/USER/PROJECT/releases/latest/download/package.zip. Das sollte auf das neueste getaggte package.zipRelease-Asset umgeleitet werden . Hoffe es ist praktisch!

Joshua Peek
quelle
1
Dokumentiert auf help.github.com/de/articles/linking-to-releases : Wenn Sie direkt auf einen Download Ihres neuesten Release-Assets verlinken
Liam
4
Es wäre jedoch hilfreich, wenn diese Funktion mit versionierten Asset-Namen funktioniert.
Liam
3
Beachten Sie, dass die Reihenfolge .../releases/latest/download/...gegen geschaltet wird .../releases/download/v0.0.0/.... Sie können nicht einfach ersetzen v0.0.0mit latestan seinem Platz.
wisbucky
2
@Joshua Peek Vielleicht könnten Sie dies erweitern, um "LATEST" im Asset-Namen als Versionszeichenfolge zu erweitern? Dies würde es für Assets mit Versionsnummern im Namen nützlich machen.
Jwatt
Was ist mit dem Herunterladen des neuesten Quellcodes? Wie heißt der Vermögenswert in diesem Fall?
Skd
59

Linux-Lösung zum Abrufen des neuesten Links zum Herunterladen von Assets (funktioniert nur, wenn das Release nur ein Asset enthält)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
Putna
quelle
7
Ein weiterer Grep in der Pipeline findet die Datei für Ihre Distribution und Architektur. Für den Atom- Texteditor unter 64-Bit-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
Kochfelder
3
Es gibt keine browser_download_url mehr. Sie können jetzt tarball_url verwenden. curl -s https://api.github.com/repos/git-ftp/git-ftp/releases | grep tarball_url | head -n 1 | cut -d '"' -f 4
Maikel
4
@maikel grepping for browser_download_url funktioniert immer noch für mich.
Léo Lam
@ léo-lam Du hast recht. Nur wenn Sie keine Assets haben, können Sie die tarball_url verwenden, um den Quellcode abzurufen.
Maikel
Sie können nur die neueste Version laden, um | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck
29

Sie können eine Ajax- Anfrage stellen, um die Download-URL der neuesten Version mithilfe der GitHub Releases-API abzurufen . Es zeigt auch, wann es veröffentlicht wurde und die Anzahl der Downloads:

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>

Es ist wichtig, dass Sie die Standard-Schaltflächen-URL für die Release-Seite festlegen (z. B. https://github.com/ShareX/ShareX/releases/latest ), wenn der Browser Ajax (oder Javascript) nicht unterstützt oder zu langsam ist Wenn Sie die URL abrufen, funktioniert der Download-Button weiterhin.

Wenn die Ajax-Anforderung abgeschlossen ist, ändert sich die URL dieser Schaltfläche automatisch in eine direkte Download-URL.

Bearbeiten:

Ich habe auch eine Download-Seite erstellt, die mehrere Releases zeigt, die Sie hier finden: https://getsharex.com/downloads/

Quellcode davon: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js

Jaex
quelle
Cool. Wissen Sie, warum dies möglicherweise nicht funktioniert? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte
Weil du keine Veröffentlichung hast. Überprüfen Sie: api.github.com/repos/DataTables/DataTables/releases
Jaex
Funky ... github.com/DataTables/DataTables/releases zeigt eine Reihe von Veröffentlichungen. Da muss es einige Unklarheiten geben.
Volte
Nein, das sind nur Tags. Es gibt keine Veröffentlichungen.
MrD
2
github.com/jquery/jquery/releases Sie haben keine Releases. Es sind nur Versions-Tags.
Jaex
15

Ruft über curlund über die Befehlszeile jqdie erste Datei der neuesten Version ab:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'
IanB
quelle
1
jq --raw-outputist eine sauberere Möglichkeit, die Anführungszeichen zu löschen. Wenn Sie nur das Neueste wollen, ist es billiger, das zu holen .../releases/latestund fallen zu lassen .[0] | . Das Abrufen aller Veröffentlichungen ermöglicht jedoch Abfragen wie jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin
Vielen Dank, Beni, ich habe dies erweitert, weil ich mir die neueste Docker-Komposition besorgt habe 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 . Das Ende war die Magie und die Verwendung des Bogens ermöglicht es mir, die Whatever.sha256-Dateien zu ignorieren, die normalerweise vorhanden sind, ohne dies zu tun |head -n 1.
Dragon788
8

Eine andere Linux-Lösung, die curl und wget verwendet, um eine einzelne Binärdatei von der neuesten Release-Seite herunterzuladen

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

Erläuterung:

curl -s -L ist das stille Herunterladen der neuesten HTML-Version (nach der folgenden Weiterleitung)

egrep -o '...' verwendet Regex, um die gewünschte Datei zu finden

wget --base=http://github.com/ -i - konvertiert den relativen Pfad von der Pipeline in eine absolute URL

und -O scollectorlegt den gewünschten Dateinamen fest.

Möglicherweise kann -Nnur zum Download hinzugefügt werden , wenn die Datei neuer ist, S3 jedoch einen 403 Forbidden-Fehler ausgegeben hat.

Greg Bray
quelle
3
Mein Ziel ist es, einen Link auf einer Website zu erstellen, der immer auf die neueste Version verweist. Ein Linux-Befehl erlaubt das nicht.
Christian Rondeau
1
Dies ist, wonach ich gesucht habe, aber Sie müssen sicherstellen, dass Sie die richtigen Escape-Zeichen für Platzhalter und Punkte haben, wenn Sie grep verwenden.
T. Thomas
@TdotThomas danke, das ist der Hinweis, den ich brauchte, damit Semver-Release-Nummern den Perioden entkommen, \.zB 2.2.0/download/[0-9\.]*/
Jeff Puckett
Nein, das tut es nicht. Kein Fluchtcharakter. Aber ich würde ein optionales vals Präfix annehmen, wie ein Tag 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 scollectorGeben Sie einfach Ihre CLI ein und es funktioniert perfekt. Danke, Greg !!
MS Berends
7

Wie bereits erwähnt, ist jq für diese und andere REST-APIs nützlich .

tl; dr - weitere Details unten

Angenommen, Sie möchten die MacOS- Version:

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"

Lösung für Atomfreisetzungen

Beachten Sie jede Repo verschiedene Möglichkeiten , um die gewünschte Artefakt haben kann, so dass ich für eine demonstrieren artig ein wie Atom .

Holen Sie sich die Namen der veröffentlichten Assets

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
...

Rufen Sie die Download-URL für das gewünschte Asset ab

Unter Atom-Mac befindet sich mein gewünschtes Asset über JQsselect(.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

Laden Sie das Artefakt herunter

curl -LO "https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.zip"

jq Spielplatz

Die jq-Syntax kann schwierig sein. Hier ist ein Spielplatz zum Experimentieren mit den jqoben genannten: https://jqplay.org/s/h6_LfoEHLZ

Sicherheit

Sie sollten Maßnahmen ergreifen, um die Gültigkeit des heruntergeladenen Artefakts über sha256sum und gpg sicherzustellen , wenn dies überhaupt möglich ist.

Mike D.
quelle
7

Eine Lösung, die (ein inneres) Wget verwendet, um den HTML-Inhalt abzurufen, nach der Zip-Datei (mit egrep) zu filtern und dann die Zip-Datei (mit dem äußeren Wget) herunterzuladen.

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

Verwenden Sie einfach eine der folgenden URLs, um die neueste Version herunterzuladen: (z. B. URLs aus dem Boxbilling-Projekt): https://api.github.com/repos/boxbilling/boxbilling/releases

Laden Sie die neueste Version als Zip herunter: https://api.github.com/repos/boxbilling/boxbilling/zipball

Laden Sie die neueste Version als Tarball herunter: https://api.github.com/repos/boxbilling/boxbilling/tarball

Klicken Sie auf eine der URLs, um die neueste Version sofort herunterzuladen. Während ich diese Zeilen schrieb, ist es derzeit: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

UPDATE: Ich habe eine andere URL in meinen Protokolldateien gefunden (siehe Beispiel oben) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master

Lahmizzar
quelle
4
Das sind Repos, keine Veröffentlichungen
Wobbles
5

Laut GitHub-Support vom 23.05.2018 nicht möglich

Kontaktierte [email protected] am 23.05.2018 mit der Nachricht:

Können Sie nur bestätigen, dass es derzeit keine andere Möglichkeit gibt, als mit der API herumzuspielen?

und sie antworteten:

Vielen Dank für Ihre Kontaktaufnahme. Wir empfehlen, die API zum Abrufen der neuesten Version zu verwenden, da dieser Ansatz stabil und dokumentiert ist und sich in Kürze nicht mehr ändern kann:

https://developer.github.com/v3/repos/releases/#get-the-latest-release

Ich werde dies auch weiterhin verfolgen unter: https://github.com/isaacs/github/issues/658

Python-Lösung ohne Abhängigkeiten

Robust und tragbar:

#!/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'])

Siehe auch:

Berücksichtigen Sie auch Vorabversionen

/latestEs werden keine Vorabversionen angezeigt, dies ist jedoch einfach, da zuerst /releasesdie neueste Version angezeigt wird:

#!/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'])
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
3

Auf der Hilfeseite " Verknüpfen mit Releases " wird zwar die Schaltfläche "Neueste Release" erwähnt, Sie erhalten jedoch keinen Download-Link.

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

Dazu müssen Sie zuerst das neueste Tag abrufen (wie unter " GitHub-URL für die neueste Version der Download-Datei ? " Erwähnt ):

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
quelle
2
Dies erfordert weiterhin, dass gh-pagesjedes Mal, wenn eine neue Version erstellt wird , eine neue Version des Zweigs gepusht wird. Das Ziel ist ein statischer Link, über den ich nur "auf die neueste Version verweisen" kann. Im Moment ist es meine beste Option, einfach auf die Release-Seite zu verweisen.
Christian Rondeau
@ ChristianRondeau Ich stimme zu. Ich habe nirgendwo in der API eine Möglichkeit gefunden, direkt auf die vollständige URL des "neuesten" Release-Archivs zu verweisen.
VonC
Trotzdem danke für den Tipp; Wenn keine besseren Antworten gegeben werden, werde ich wahrscheinlich ein Skript erstellen, um Gh-Seiten mithilfe Ihres Skripts zu aktualisieren.
Christian Rondeau
2

in PHP - Weiterleitung zum neuesten Release-Download. Legen Sie einfach Ihren Webspace an

<?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
quelle
2

Wenn Sie nur verwenden möchten, curlkönnen Sie versuchen -w '%{url_effective}', die URL nach einer Umleitungskette zu drucken (gefolgt von Curl, wenn Sie sie mit aufrufen -L). So zum Beispiel

curl -sLo /dev/null -w '%{url_effective}' https://github.com/github-tools/github/releases/latest

Ausgänge https://github.com/github-tools/github/releases/tag/v3.1.0.

Mapio
quelle
2

Github unterstützt jetzt statische Links zum Herunterladen einzelner Dateien aus der neuesten Version: https://help.github.com/de/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip
Kaloyan Raev
quelle
Die gleiche Antwort wurde bereits 6 Monate zuvor veröffentlicht: stackoverflow.com/questions/24987542/…
wisbucky
Vielen Dank, dass Sie mich auf @wisbucky aufmerksam gemacht haben. Ich habe es dann verworfen, da es sich wie eine benutzerdefinierte Implementierung eines Entwicklers anhörte, nicht von jemandem von StackOverflow!
Christian Rondeau
2

Wie die meisten, die diese Frage besuchten, war ich absolut frustriert, einen Weg zu finden, den Download der neuesten Version oder eines Repos in Github vollständig zu automatisieren . Der Vorteil dieser Lösung besteht darin, dass Sie keine Versions- oder Tag-Nummer angeben müssen - sie wird nur die NEUESTE erhalten .

Ich habe meine Tests mit dem folgenden Github-Benutzer & Repo durchgeführt:

" f1linux " = Github-Benutzer
" pi-ap " = Repo

Der beliebige Verzeichnisname, in dem das Repo gespeichert wird, wird wie folgt festgelegt:

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

DIREKTE:

Mit den " Web Developer " -Tools von Firefox (3 Balken in der oberen rechten Ecke) wurde im Abschnitt " Netzwerk ", zu dem ich gefunden habe, https://api.github.comumgeleitet. Durch Weiterleiten https://codeload.github.comdes curlan konnte tarich das neueste versionierte Repo abrufen und es unter einem vorhersehbaren Namen speichern es könnte betrieben werden auf:

curl https://codeload.github.com/f1linux/pi-ap/legacy.tar.gz/master | tar xzvf - --one-top-level="pi-ap" --strip-components 1

INDIREKT:

Nachdem ich mithilfe einer DIRECT- URL vollautomatische Downloads der neuesten Version erhalten hatte , konzentrierte ich mich darauf, dasselbe mit Githubs Umleitung zu erreichen:

curl -L https://api.github.com/repos/f1linux/pi-ap/tarball | tar xzvf - --one-top-level="pi-ap" --strip-components 1

Bevorzugte Methode:

Bitte beachten Sie jedoch gemäß dem Kommentar von Von, dass INDIREKT die bevorzugte Methode ist

Weitere Validierung:

Um sicherzustellen, dass meine Ergebnisse mit anderen versionierten Github-Repos reproduzierbar sind, wurden dieselben Tests erfolgreich für das doctlAPI-Toolkit von Digital Ocean durchgeführt (mit dem die gesamte Übung tatsächlich begonnen hat!):

Beide DIREKT als auch INDIRECT arbeiten mit derselben Form wie oben und ändern lediglich den Benutzernamen und das Repo:

DIREKTE:

curl https://codeload.github.com/digitalocean/doctl/legacy.tar.gz/master | tar xzvf - --one-top-level="doctl" --strip-components 1 

INDIREKT:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1
F1Linux
quelle
Interessant. Upvoted. Das Codeload war mir nicht bekannt, obwohl die Verwendung der API weiterhin empfohlen wird: stackoverflow.com/a/60198721/6309
VonC
Die Umleitung hat mich anfangs in Trauer versetzt, und wie in der Antwort erwähnt, haben mich die "Web Developer" -Tools von Firefox auf den richtigen Weg gebracht. Konnte hier aber nicht aufhören, musste es mit der Umleitung zum Laufen bringen. Vielen Dank für die positive Zustimmung!
F1Linux
1
@VonC Habe gerade dein Feedback zur Antwort hinzugefügt. Ich war mir dessen überhaupt nicht bewusst. Vielen Dank für den Hinweis!
F1Linux
1

Ich möchte die Releases aus der README.mdDatei in der Repository-Beschreibung herunterladen . Dort kann ich kein JavaScript ausführen.

Ich kann der README-Datei oder den Github-Seiten für alle meine Repositorys solche Links hinzufügen:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Lädt die neueste Release-Datei aus dem Repository herunter.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Dies funktioniert, weil der JavaScript-Referrer festgelegt ist und das herunterzuladende Repository über festgelegt wird document.referrer. Somit funktioniert der Link auch für Gabeln.

Sie finden den Quellcode hier , gabeln oder verwenden Sie einfach mein Repo.

Benutzer
quelle
1
Das ist eine ziemlich clevere Idee :) Es funktioniert nicht, wenn Links geteilt oder Curl oder ähnliches verwendet werden, aber diese Idee kann auf den Github-Seiten des Projekts umgesetzt werden.
Christian Rondeau
1
Da dies als JavaScript-Website möglich ist, könnte man auch einen Dienst schreiben, der eine Umleitung durchführt. download-service.com/organization/repository/artifact
Benutzer
0

Für den Fall, dass das Repo nur Tags anstelle von Release verwendet - vgl. jQuery - Die Lösungen, die auf einer URL basieren, funktionieren nicht.

Stattdessen müssen Sie alle Tags abfragen, sortieren und die Download-URL erstellen. Ich habe eine solche Lösung für die Sprache Go und das jQuery-Repo implementiert: Link to Github .

Vielleicht hilft das jemandem.

SommerEngineering
quelle