¿Existe un enlace a GitHub para descargar un archivo en la última versión de un repositorio?

137

Con la función de lanzamiento de GitHub , es posible proporcionar un enlace para descargar una versión específica del software publicado. Sin embargo, cada vez que se realiza un lanzamiento, la página gh también debe actualizarse.

¿Hay alguna manera de obtener un enlace a un archivo específico de la versión más reciente de un software?

por ejemplo, este sería un enlace estático:

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

Lo que me gustaría es algo como:

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

NOTA: La diferencia entre esta pregunta y la última versión de GitHub es que esta pregunta específicamente pide obtener acceso al archivo, no a la página de la última versión de GitHub

Christian Rondeau
fuente
1
Github ahora lo admite de forma nativa (con una ligera diferencia en el formato de URL). Ver stackoverflow.com/questions/24987542/…
wisbucky el

Respuestas:

38

Unos años tarde, pero acabo de implementar una simple redirección al soporte https://github.com/USER/PROJECT/releases/latest/download/package.zip. Eso debería redirigirse al último package.ziprecurso de lanzamiento etiquetado . Espero que sea útil!

Joshua Peek
fuente
2
Documentado en help.github.com/en/articles/linking-to-releases : si desea vincular directamente a una descarga de su último recurso de lanzamiento, puede hacerlo a / owner / name / releases / latest / download / asset -name.zip
Liam
44
Sin embargo, sería útil que esta característica funcionara con nombres de activos versionados.
Liam
3
Tenga en cuenta que el orden se activa .../releases/latest/download/...vs .../releases/download/v0.0.0/.... No puede simplemente reemplazar v0.0.0con latesten su lugar.
wisbucky
2
@ Joshua Peek ¿Quizás podría extender esto para expandir "ÚLTIMO" en el nombre del activo para que sea la cadena de versión? Eso lo haría útil para activos con números de versión en su nombre.
jwatt
¿Qué pasa con la descarga del último código fuente? ¿Cuál es el nombre del activo en ese caso?
skd
59

Solución de Linux para obtener el enlace de descarga de activos de la última versión (solo funciona si la versión tiene un solo activo)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
Putna
fuente
77
Un grep adicional en la tubería encontrará el archivo para su distribución y arquitectura. Para el editor de texto atom en Ubuntu de 64 bits: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
Ya no hay browser_download_url. Puedes usar tarball_url ahora. curl -s https://api.github.com/repos/git-ftp/git-ftp/releases | grep tarball_url | head -n 1 | cut -d '"' -f 4
maikel
44
@maikel grepping para browser_download_url todavía funciona para mí.
Léo Lam
@ léo-lam Tienes razón. Solo si no tiene activos, puede usar tarball_url para obtener el código fuente.
maikel
Solo puede cargar la última versión para evitar | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck
29

Puede hacer una solicitud ajax para obtener la última URL de descarga de versión utilizando la API de versiones de GitHub . También muestra cuándo se lanzó y el recuento de descargas:

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 importante que establezca la URL del botón predeterminado en la página de lanzamientos (como https://github.com/ShareX/ShareX/releases/latest ), de modo que si el navegador no admite ajax (o javascript) o es demasiado lento para obtener la URL, el botón de descarga seguirá funcionando.

Cuando se completa la solicitud de Ajax, la URL de este botón cambiará automáticamente a una URL de descarga directa.

Editar:

También hice una página de descargas que muestra varios lanzamientos que puedes encontrar aquí: https://getsharex.com/downloads/

Código fuente: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js

Jaex
fuente
Frio. ¿Sabes por qué esto podría no funcionar? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte
Porque no tienes ninguna liberación. Consulta: api.github.com/repos/DataTables/DataTables/releases
Jaex
Funky ... github.com/DataTables/DataTables/releases muestra un montón de lanzamientos. Debe haber cierta ambigüedad allí.
Volte
No, estas son solo etiquetas. No hay lanzamientos.
MrD
2
github.com/jquery/jquery/releases no tienen lanzamientos. Es solo etiquetas de versión.
Jaex
15

Desde la línea de comando usando curly jq, recupera el primer archivo de la última versión:

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'
IanB
fuente
1
jq --raw-outputes una forma más limpia de descartar las comillas. Si solo quieres lo último, es más barato buscarlo .../releases/latesty soltarlo .[0] | . Pero obtener todos los lanzamientos permite consultas como jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin
Gracias Beni, que amplió este para agarrar la última ventana acoplable-componer, 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 . El final fue la magia y usar el arco me permite ignorar los archivos whatever.sha256 que normalmente están presentes sin hacer |head -n 1.
dragon788
8

Otra solución de Linux que utiliza curl y wget para descargar un solo archivo binario desde la última página de lanzamiento

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

Explicación:

curl -s -L es descargar silenciosamente la última versión HTML (después de seguir la redirección)

egrep -o '...' usa expresiones regulares para encontrar el archivo que deseas

wget --base=http://github.com/ -i - convierte la ruta relativa de la canalización a URL absoluta

y -O scollector establece el nombre del archivo deseado.

puede agregarse -Na solo descargar si el archivo es más nuevo pero S3 estaba dando un error prohibido 403.

Greg Bray
fuente
3
Mi objetivo es hacer un enlace en un sitio web que siempre apunte a la última versión. Un comando de Linux no lo permitirá.
Christian Rondeau
1
Esto es lo que estaba buscando, pero debe asegurarse de tener los caracteres de escape correctos para los comodines y los puntos cuando use grep.
T. Thomas
@TdotThomas gracias, esa es la pista que necesitaba para que los números de lanzamiento de semver escaparan de los períodos, \.por ejemplo, 2.2.0 necesario/download/[0-9\.]*/
Jeff Puckett
No lo hace Sin escape char. Pero supondría un opcional vcomo prefijo, como una etiqueta v0.11.0. Simplemente ingrese 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 scollectorsu CLI y funciona perfectamente. ¡Gracias Greg!
MS Berends
7

Como se señaló anteriormente, jq es útil para esta y otras API REST .

tl; dr - más detalles a continuación

Suponiendo que desea la versión de 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"

Solución para liberaciones de átomos

Tenga en cuenta que cada repositorio puede tener diferentes formas de proporcionar el artefacto deseado, por lo que demostraré un átomo de buen comportamiento .

Obtener los nombres de los activos publicados.

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

Obtenga la URL de descarga para el activo deseado

Debajo de atom-mac está mi activo deseado a través de jq'sselect(.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

Descargar el artefacto

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

jq Playground

La sintaxis jq puede ser difícil. Aquí hay un patio de recreo para experimentar con lo jqanterior: https://jqplay.org/s/h6_LfoEHLZ

Seguridad

Debe tomar medidas para garantizar la validez del artefacto descargado mediante sha256sum y gpg , si es posible.

Mike D
fuente
7

Una solución que utiliza wget (interno) para obtener el contenido HTML, filtre el archivo zip (con egrep) y luego descargue el archivo zip (con el wget externo).

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

Solo use una de las siguientes URL para descargar la última versión: (tomó las URL del proyecto de boxbilling, por ejemplo): https://api.github.com/repos/boxbilling/boxbilling/releases

Descargue la última versión como zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Descargue la última versión como tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball

Haga clic en una de las URL para descargar la última versión al instante. Mientras escribía estas líneas, actualmente es: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

ACTUALIZACIÓN: Encontré otra URL en mis archivos de registro (ref. Al ejemplo anterior) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master

Lahmizzar
fuente
44
esos son repos no lanzamientos
Wobbles
5

No es posible según el soporte de GitHub a partir del 23/05/2018

Contactado [email protected] el 23/05/2018 con el mensaje:

¿Puedes confirmar que no hay forma de jugar con API actualmente?

y ellos respondieron:

Gracias por contactarnos. Recomendamos utilizar la API para obtener la última versión porque ese enfoque es estable, está documentado y no está sujeto a cambios en el corto plazo:

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

También seguiré rastreando esto en: https://github.com/isaacs/github/issues/658

Solución Python sin dependencias.

Robusto y portátil:

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

Ver también:

Considere también las versiones preliminares

/latestno ve prelanzamientos, pero es fácil de hacer ya que /releasesmuestra primero el último:

#!/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 郝海东 冠状 病 六四 事件 法轮功
fuente
3

La página de ayuda Vinculación a versiones menciona un botón de "Última versión", pero eso no le proporciona un enlace de descarga.

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

Para eso, primero debe obtener la última etiqueta (como se menciona en "¿ URL de GitHub para la última versión del archivo de descarga ? "):

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
fuente
2
Esto todavía requiere impulsar una nueva versión de la gh-pagesrama cada vez que se realiza una nueva versión; el objetivo es tener un enlace estático que pueda usar para "referirme a la última versión". En este momento, mi mejor opción es referirme a la página de lanzamientos.
Christian Rondeau
@ChristianRondeau Estoy de acuerdo. No vi en ninguna parte de la API una forma de hacer referencia a la URL más reciente del archivo de lanzamiento "más reciente".
VonC
Aún así, gracias por el consejo; Si no se proporcionan mejores respuestas, probablemente terminaré haciendo un script para actualizar gh-pages usando su script.
Christian Rondeau
2

en PHP: redirige a la descarga de la última versión. Simplemente colóquelo en su espacio 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);
Alex
fuente
2

Si desea usar solo curlpuede probar con -w '%{url_effective}'eso imprime la URL después de una cadena de redireccionamiento (seguido de curl si lo invoca -L). Así por ejemplo

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

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

Mapio
fuente
2

Github ahora admite enlaces estáticos para descargar archivos individuales de la última versión: https://help.github.com/en/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip
Kaloyan Raev
fuente
La misma respuesta ya se publicó 6 meses antes: stackoverflow.com/questions/24987542/…
wisbucky
Gracias por llamar mi atención sobre esto @wisbucky, lo descarté porque sonaba como una implementación personalizada de un desarrollador, ¡no alguien de StackOverflow!
Christian Rondeau
2

Como la mayoría de los visitantes de esta pregunta, me sentí absolutamente frustrado al encontrar una manera de automatizar completamente la descarga de la ÚLTIMA versión versionada o un repositorio en Github. El beneficio de esta solución es que no tiene que especificar ningún número de versión o etiqueta, solo tomará el ÚLTIMO .

Realicé mis pruebas usando el siguiente usuario y repositorio de Github:

" f1linux " = Usuario de Github
" pi-ap " = Repo

El nombre de directorio arbitrario en el que se guarda el repositorio se establece en:

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

DIRECTO:

El uso de Firefox " Web Developer herramientas" (3 bares en la esquina superior derecha), en la " Red de la sección" I Found https://api.github.comestaba a redirigir a https://codeload.github.com, por lo que mediante la canalización de la curlque taryo era capaz de agarrar la última cesión temporal versionado y guardarlo en un nombre predecible por lo podría ser operado en:

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

INDIRECTO:

Después de lograr descargas totalmente automatizadas de la última versión versionada usando una URL DIRECTA , volví mi atención a lograr lo mismo con la redirección de Github:

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

Metodo preferido:

Sin embargo, tenga en cuenta según el comentario de Von a continuación que INDIRECTO es el método preferido

Validación adicional:

Para garantizar que mis resultados fueran reproducibles en otros repositorios de Github versionados, se ejecutaron con éxito las mismas pruebas para el doctlkit de herramientas api de Digital Ocean (que es lo que comenzó todo el ejercicio en realidad):

Tanto DIRECTO y INDIRECTA funcionan con el mismo formulario que el anterior, solo cambiando el nombre de usuario y el repositorio:

DIRECTO:

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

INDIRECTO:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1
F1Linux
fuente
Interesante. Votado No estaba al tanto sobre codeload, aunque todavía se recomienda el uso de la API: stackoverflow.com/a/60198721/6309
VonC
Inicialmente me topé con la redirección y, como se señaló en la respuesta, las herramientas de "Desarrollador web" de Firefox me llevaron por el camino correcto. Sin embargo, no podía parar allí, tenía que hacerlo funcionar con la redirección. Gracias por el voto a favor, más agradecido!
F1Linux
1
@VonC Acabo de agregar sus comentarios a la respuesta. No estaba totalmente consciente de esto. ¡Gracias por mencionarlo!
F1Linux
1

Quiero descargar las versiones del README.mdarchivo en la descripción del repositorio. Allí, no puedo ejecutar JavaScript.

Puedo agregar enlaces como estos al archivo README o páginas github para todos mis repositorios:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Descarga el archivo de la última versión del repositorio.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Esto funciona porque el referente de JavaScript está configurado y el repositorio para descargar se determina a través document.referrer. Por lo tanto, el enlace también funcionará para horquillas.

Puede encontrar el código fuente aquí , bifurcar o simplemente usar mi repositorio.

Usuario
fuente
1
Esa es una idea bastante inteligente :) no funcionará al compartir enlaces o usar curl o me gusta, pero esta idea se puede hacer en las páginas de github del proyecto.
Christian Rondeau
1
Como esto es posible como un sitio web de JavaScript, también se podría escribir un servicio que redirija. download-service.com/organization/repository/artifact
Usuario
0

En caso de que el repositorio use solo etiquetas en lugar de lanzamiento, cf. jQuery: las soluciones basadas en una URL no funcionan.

En su lugar, debe consultar todas las etiquetas, ordenarlas y construir la URL de descarga. Implementé una solución para el lenguaje Go y el repositorio jQuery: Link to Github .

Quizás, esto ayude a alguien.

SommerIngeniería
fuente