Esiste un collegamento a GitHub per il download di un file nell'ultima versione di un repository?


137

Utilizzando la funzione di rilascio di GitHub , è possibile fornire un collegamento per scaricare una versione specifica del software pubblicato. Tuttavia, ogni volta che viene rilasciata una versione, anche la pagina gh deve essere aggiornata.

C'è un modo per ottenere un collegamento a un file specifico di qualunque sia l'ultima versione di un software?

ad esempio, questo sarebbe un collegamento statico:

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

Quello che mi piacerebbe è qualcosa di simile:

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

NOTA: la differenza tra questa domanda e l' ultima versione di GitHub è che questa domanda richiede specificamente l'accesso al file, non alla pagina dell'ultima versione di GitHub


1
Questo è supportato nativamente da Github ora (con una leggera differenza nel formato URL). Vedere stackoverflow.com/questions/24987542/...
wisbucky

Risposte:


38

Qualche anno in ritardo, ma ho appena implementato un semplice reindirizzamento per supportare https://github.com/USER/PROJECT/releases/latest/download/package.zip. Ciò dovrebbe essere reindirizzato all'ultimo package.zipasset di rilascio con tag . Spero sia utile!


2
Documentato su help.github.com/en/articles/linking-to-releases : se desideri collegarti direttamente a un download della risorsa dell'ultima versione, puoi collegarti a / owner / name / release / latest / download / asset -name.zip
Liam

4
Sarebbe utile se questa funzionalità funzionasse con nomi di asset con versione, tuttavia.
Liam,

3
Si noti che l'ordine commutata .../releases/latest/download/...vs .../releases/download/v0.0.0/.... Non puoi semplicemente sostituirlo v0.0.0con latestsul posto.
Wisbucky,

2
@Joshua Peek Forse potresti estenderlo per espandere "LATEST" nel nome dell'asset come stringa della versione? Ciò lo renderebbe utile per le risorse con i numeri di versione nel loro nome.
jwatt,

Che ne dici di scaricare l'ultimo codice sorgente? Qual è il nome dell'asset in quel caso?
skd

59

Soluzione Linux per ottenere il collegamento per il download delle risorse dell'ultima versione (funziona solo se la versione ha una sola risorsa)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4

7
Un grep aggiuntivo nella pipeline troverà il file per la tua distribuzione e architettura. Per l' editor di testo atom su Ubuntu a 64 bit:curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
piani cottura

3
Non c'è più browser_download_url. Puoi usare tarball_url ora. 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 per browser_download_url funziona ancora per me.
Léo Lam,

@ léo-lam Hai ragione. Solo se non hai risorse, puoi usare tarball_url per ottenere il codice sorgente.
maikel,

È possibile caricare solo l'ultima versione per evitare | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck

29

È possibile eseguire una richiesta Ajax per ottenere l'URL di download dell'ultima versione utilizzando l' API delle uscite di GitHub . Mostra anche quando è stato rilasciato e il conteggio dei download:

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>

È importante impostare l'URL del pulsante predefinito sulla pagina delle versioni (come https://github.com/ShareX/ShareX/releases/latest ), quindi se il browser non supporta ajax (o javascript) o è troppo lento per ottieni l'URL, il pulsante di download continuerà a funzionare.

Al termine della richiesta Ajax, l'URL di questo pulsante cambierà automaticamente in un URL di download diretto.

Modificare:

Ho anche creato una pagina di download che mostra più versioni che puoi trovare qui: https://getsharex.com/downloads/

Codice sorgente: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js


Freddo. Sai perché questo potrebbe non funzionare? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte,

Perché non hai alcun rilascio. Controlla: api.github.com/repos/DataTables/DataTables/releases
Jaex,

Funky ... github.com/DataTables/DataTables/releases mostra un sacco di versioni. Ci deve essere qualche ambiguità lì.
Volte,

No, questi sono solo tag. Non ci sono rilasci.
MrD

2
github.com/jquery/jquery/releases non hanno alcun rilascio. Sono solo i tag di versione.
Jaex,

15

Dalla riga di comando utilizzando curle jq, recupera il primo file dell'ultima versione:

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

1
jq --raw-outputè un modo più pulito di eliminare le virgolette. Se vuoi solo l'ultimo è più economico recuperare .../releases/lateste rilasciare il file .[0] | . Ma il recupero di tutte le versioni consente query come jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin,

Grazie Beni, ho ampliato tale per afferrare l'ultima finestra mobile-composizione, 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 . Il fine era la magia e l'uso dell'arco mi ha permesso di ignorare i file qualunque.sha256 che sono tipicamente presenti senza farlo |head -n 1.
dragon788,

8

Un'altra soluzione Linux che utilizza curl e wget per scaricare un singolo file binario dalla pagina dell'ultima versione

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

Spiegazione:

curl -s -L è scaricare silenziosamente l'ultima versione HTML (dopo il seguente reindirizzamento)

egrep -o '...' usa regex per trovare il file desiderato

wget --base=http://github.com/ -i - converte il percorso relativo dalla pipeline in URL assoluto

e -O scollectorimposta il nome file desiderato.

potrebbe essere possibile aggiungere -Nal download solo se il file è più recente ma S3 stava dando un errore 403 proibito.


3
Il mio obiettivo è creare un collegamento su un sito Web che punti sempre all'ultima versione. Un comando linux non lo consentirà.
Christian Rondeau,

1
Questo è quello che stavo cercando, ma devi assicurarti di avere i caratteri di escape corretti per i caratteri jolly e i punti quando usi grep.
T. Thomas,

@TdotThomas grazie, questo è il suggerimento di cui avevo bisogno per i numeri di rilascio semver per sfuggire ai periodi \.necessari ad es. 2.2.0/download/[0-9\.]*/
Jeff Puckett,

No, non lo fa. Nessun carattere di escape. Ma io vorrei presumere un optional vcome prefisso, come un tag v0.11.0. Basta inserire 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 scollectornella tua CLI e funziona perfettamente. Grazie Greg !!
MS Berends,

7

Come notato in precedenza, jq è utile per questa e altre API REST .

tl; dr - ulteriori dettagli di seguito

Supponendo che desideri la versione 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"

Soluzione per le versioni atomiche

Nota che ogni repository può avere modi diversi di fornire l'artefatto desiderato, quindi dimostrerò per un ben educato come l' atomo .

Ottieni i nomi degli asset pubblicati

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

Ottieni l'URL di download per la risorsa desiderata

Sotto atom-mac è la mia risorsa desiderata tramite 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

Scarica l'artefatto

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

jq Playground

La sintassi jq può essere difficile. Ecco un parco giochi per sperimentare quanto jqsopra: https://jqplay.org/s/h6_LfoEHLZ

Sicurezza

Dovresti prendere misure per garantire la validità del manufatto scaricato tramite sha256sum e gpg , se possibile.


7

Una soluzione che utilizza (un interno) wget per ottenere il contenuto HTML, filtrarlo per il file zip (con egrep) e quindi scaricare il file zip (con il wget esterno).

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

6

Basta usare uno degli URL di seguito per scaricare l'ultima versione: (preso ad esempio gli URL dal progetto boxbilling): https://api.github.com/repos/boxbilling/boxbilling/releases

Scarica l'ultima versione come zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Scarica l'ultima versione come tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball

Fai clic su uno degli URL per scaricare immediatamente l'ultima versione. Come ho scritto questa riga è attualmente: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

AGGIORNAMENTO: Ho trovato un altro URL nei miei file di registro (rif. All'esempio precedente) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master


4
quelli sono
repository

5

Non possibile secondo il supporto di GitHub dal 23/05/2018

Contatta support@github.com il 23/05/2018 con il messaggio:

Puoi semplicemente confermare che al momento non c'è altro modo di fare confusione con l'API?

e hanno risposto:

Grazie per il contatto. Ti consigliamo di utilizzare l'API per recuperare l'ultima versione perché tale approccio è stabile, documentato e non soggetto a modifiche in qualsiasi momento:

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

Continuerò anche a rintracciarlo su: https://github.com/isaacs/github/issues/658

Soluzione Python senza dipendenze

Robusto e portatile:

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

Guarda anche:

Considera anche le pre-release

/latestnon vede pre-release, ma è facile da fare poiché /releasesmostra prima l'ultimo:

#!/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

La pagina di aiuto per il collegamento alle versioni menziona un pulsante "Ultima versione", ma non è presente un link per il download.

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

Per questo, devi prima ottenere l'ultimo tag (come indicato in " URL GitHub per l'ultima versione del file di download ? "):

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

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.zip

2
Ciò richiede comunque di inviare una nuova versione del gh-pagesramo ogni volta che viene effettuata una nuova versione; l'obiettivo è di avere un collegamento statico che posso usare solo per "fare riferimento all'ultima versione". In questo momento la mia migliore opzione è solo fare riferimento alla pagina delle versioni.
Christian Rondeau,

@ChristianRondeau Sono d'accordo. Non ho visto da nessuna parte nell'API un modo per fare riferimento direttamente all'URL completo dell'archivio di versioni "più recenti".
VonC,

Comunque, grazie per la punta; se non vengono fornite risposte migliori, probabilmente finirò per fare uno script per aggiornare gh-pages usando il tuo script.
Christian Rondeau,

2

in PHP - reindirizza al download dell'ultima versione. Metti semplicemente il tuo spazio web

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

2

Se vuoi usare solo curlpuoi provare a -w '%{url_effective}'stampare l'URL dopo una catena di reindirizzamento (seguito da arricciatura se lo invochi con -L). Quindi, per esempio

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

uscite https://github.com/github-tools/github/releases/tag/v3.1.0.


2

Github ora supporta collegamenti statici per il download di singoli file dall'ultima versione: https://help.github.com/en/articles/linking-to-releases

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

La stessa risposta è stata già pubblicato 6 mesi prima: stackoverflow.com/questions/24987542/...
wisbucky

Grazie per avermi portato alla mia attenzione @wisbucky, l'ho scartato da quando sembrava un'implementazione personalizzata di uno sviluppatore, non di StackOverflow!
Christian Rondeau,

2

Come la maggior parte delle persone che visitano questa domanda, sono stato assolutamente frustrato nel trovare un modo per automatizzare completamente il download dell'ultima versione aggiornata o un repository in Github. Il vantaggio di questa soluzione è che non è necessario specificare alcun numero di rilascio o tag: prenderà solo l' ULTIMO .

Ho condotto i miei test utilizzando il seguente utente e repository Github:

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

Il nome di directory arbitrario in cui viene salvato il repository è impostato in:

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

DIRETTO:

Usando gli strumenti " Web Developer " di Firefox (3 barre nell'angolo in alto a destra), nella sezione " Rete " ho trovato il https://api.github.comreindirizzamento a https://codeload.github.com, quindi eseguendo il piping curlal tarsono stato in grado di afferrare l'ultimo repository con versione più recente e salvarlo con un nome prevedibile così potrebbe funzionare su:

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

INDIRETTI:

Dopo aver ottenuto download completamente automatizzati dell'ultima versione aggiornata utilizzando un URL DIRECT , ho rivolto la mia attenzione al raggiungimento dello stesso con il reindirizzamento di Github:

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

Metodo preferito:

Tuttavia, si prega di notare che, secondo il commento di Von di seguito, INDIRETTO è il metodo preferito

Ulteriore convalida:

Per garantire che i miei risultati fossero riproducibili su altri repository Github con versione, gli stessi test sono stati eseguiti con successo per l' doctlAPI Toolkit di Digital Ocean (che è ciò che ha iniziato l'intero esercizio in realtà!):

Sia DIRECT che INDIRECT funzionano utilizzando lo stesso modulo di cui sopra, cambiando semplicemente nome utente e repository:

DIRETTO:

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

INDIRETTI:

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

Interessante. Upvoted. Non ero a conoscenza circa codeload, anche se si utilizza l'API è ancora raccomandato: stackoverflow.com/a/60198721/6309
VonC

Inizialmente ho avuto un lutto per il reindirizzamento e, come indicato nella risposta, gli strumenti "Web Developer" di Firefox mi hanno portato sulla strada giusta. Non potevo fermarmi qui, dovevo farlo funzionare con il reindirizzamento. Grazie per il voto - più obbligato!
F1Linux il

1
@VonC Ho appena aggiunto il tuo feedback alla risposta. Non ne ero assolutamente a conoscenza. Grazie per segnalarlo!
F1Linux il

1

Voglio scaricare le versioni dal README.mdfile nella descrizione del repository. Lì, non riesco a eseguire JavaScript.

Posso aggiungere collegamenti come questi al file README o alle pagine github per tutti i miei repository:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Scarica l'ultimo file di rilascio dal repository.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Questo funziona perché il referrer JavaScript è impostato e viene determinato il repository da scaricare document.referrer. Pertanto, il collegamento funzionerà anche con le forcelle.

Puoi trovare il codice sorgente qui , fork o semplicemente usare il mio repository.


1
È un'idea abbastanza intelligente :) non funzionerà quando condividi i link o usi l'arricciatura o simili, ma questa idea può essere fatta nelle pagine github del progetto.
Christian Rondeau,

1
Dato che questo è possibile come sito Web JavaScript, si potrebbe anche scrivere un servizio che reindirizza. download-service.com/organization/repository/artifact
Utente

0

Nel caso in cui il repository stia utilizzando solo tag anziché release - cfr. jQuery: le soluzioni basate su un URL non funzionano.

Invece, devi interrogare tutti i tag, ordinarli e costruire l'URL di download. Ho implementato una soluzione del genere per la lingua Go e il repository jQuery: Link a Github .

Forse questo aiuta qualcuno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.