web-dev-qa-db-fra.com

Existe-t-il un lien vers GitHub pour le téléchargement d'un fichier dans la dernière version d'un référentiel?

En utilisant fonctionnalité Release de GitHub , il est possible de fournir un lien pour télécharger une version spécifique du logiciel publié. Cependant, chaque fois qu'une version est publiée, la page gh doit également être mise à jour.

Existe-t-il un moyen d’obtenir un lien vers un fichier spécifique de la dernière version d’un logiciel?

par exemple, ce serait un lien statique:

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

Ce que j'aimerais, c'est quelque chose comme:

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

NOTE: La différence entre cette question et dernière version de GitHub est que cette question demande spécifiquement l'accès au fichier, et non la page de la dernière version de GitHub.

118
Christian Rondeau

Github prend désormais en charge les liens statiques permettant de télécharger des fichiers individuels à partir de la dernière version: https://help.github.com/fr/articles/linking- to-release

https://github.com/USER/PROJECT/releases/latest/download/package.Zip
2
Kaloyan Raev

Solution Linux pour obtenir le lien de téléchargement d'actif de la dernière version (fonctionne uniquement si la version ne contient qu'un seul actif)

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

Vous pouvez faire une demande ajax pour obtenir l'URL de téléchargement de la dernière version à l'aide de API GitHub Releases . Il indique également la date de publication et le nombre de téléchargements:

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>

Il est important que vous définissiez l'URL du bouton par défaut sur la page des versions (comme https://github.com/ShareX/ShareX/releases/latest ). Par conséquent, si le navigateur ne prend pas en charge ajax (ou javascript) ou est trop lent pour obtenir l'URL, le bouton de téléchargement fonctionnera toujours.

Lorsque la demande Ajax est terminée, l'URL de ce bouton devient automatiquement une URL de téléchargement direct.

Modifier:

J'ai également créé une page de téléchargement contenant plusieurs versions que vous pouvez trouver ici: https://getsharex.com/downloads/

Code source de celui-ci: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js

29
Jaex

À partir de la ligne de commande, à l'aide de curl et jq, récupère le fichier premier de la version dernière:

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

Une autre solution Linux utilisant curl et wget pour télécharger un seul fichier binaire à partir de la dernière page de version

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

Explication:

curl -s -L est de télécharger en mode silencieux la dernière version HTML (après la redirection suivante)

egrep -o '...' utilise regex pour trouver le fichier que vous voulez

wget --base=http://github.com/ -i - convertit le chemin relatif du pipeline en URL absolue

et -O scollector définit le nom de fichier souhaité.

peut être en mesure d'ajouter -N à ne télécharger que si le fichier est plus récent mais que S3 donnait une erreur 403 Forbidden.

8
Greg Bray

Quelques années de retard, mais je viens de mettre en place une redirection simple pour supporter https://github.com/USER/PROJECT/releases/latest/download/package.Zip. Cela devrait être redirigé vers le dernier taggé package.Zip libère l'actif. J'espère que c'est pratique!

8
Joshua Peek

Comme indiqué précédemment, jq est utile pour cela et d'autres API REST .

tl; dr - plus de détails ci-dessous

En supposant que vous souhaitiez la version 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"

Solution pour atom releases

Note chaque repo peut avoir différentes façons de fournir l'artefact souhaité, je vais donc démontrer qu'il s'agit d'un atome bien comporté comme atome .

Obtenir les noms des actifs publiés

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

Obtenir l'URL de téléchargement pour l'actif souhaité

Ci-dessous atom-mac est mon atout souhaité via jq's select(.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

Télécharger l'artefact

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

terrain de jeu jq

la syntaxe jq peut être difficile. Voici un terrain de jeu pour expérimenter avec le jq ci-dessus: https://jqplay.org/s/h6_LfoEHLZ

Sécurité

Vous devez prendre des mesures pour garantir la validité de l'artefact téléchargé via sha256sum et gpg , si possible.

7
Mike D

Une solution utilisant (un interne) wget pour récupérer le contenu HTML, le filtrer pour le fichier Zip (avec egrep), puis télécharger le fichier Zip (avec le wget externe).

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

Utilisez simplement l’une des URL ci-dessous pour télécharger la dernière version: (exemple: a pris les URL du projet Boxbilling): https://api.github.com/repos/boxbilling/boxbilling/releases

Téléchargez la dernière version au format Zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Téléchargez la dernière version au format tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball

Cliquez sur l'une des URL pour télécharger la dernière version instantanément. Au moment où j’écrivais ces lignes, c’est actuellement: boxbilling-boxbilling-4.20-30-g452ad1c [.Zip/.tar.gz]

UPDATE: Trouvé une autre URL dans mes fichiers journaux (voir l'exemple ci-dessus) https://codeload.github.com/boxbilling/ boxbilling/legacy.tar.gz/master

5
Lahmizzar

Impossible avec l'assistance de GitHub à compter du 2018-05-23

Contactez [email protected] le 2018-05-23 avec le message suivant:

Pouvez-vous simplement confirmer qu'il n'y a pas d'autre moyen que de jouer avec les API actuellement?

et ils ont répondu:

Merci de tendre la main. Nous vous recommandons d'utiliser l'API pour récupérer la dernière version car cette approche est stable, documentée et non susceptible de changer à tout moment:

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

Je continuerai également à suivre cela à: https://github.com/isaacs/github/issues/658

Solution Python sans aucune dépendance

Robuste et portable:

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

Voir également:

Considérez également les pré-versions

/latest ne voit pas les pré-versions, mais il est facile à faire puisque /releases montre la dernière en premier:

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

La page d'aide Lien vers les versions mentionne un bouton "Dernière version", mais cela ne vous donne pas un lien de téléchargement.

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

Pour cela, vous devez commencer par obtenir la dernière balise (comme indiqué dans " RL de GitHub pour la dernière version du fichier de téléchargement ) ? = "):

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

curl -L https://github.com/reactiveui/ReactiveUI/releases/download/$latestTag/ReactiveUI-$latestTag.Zip
3
VonC

in PHP - redirige vers la dernière version téléchargée. Mettez simplement sur votre espace 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
Alex

Si vous voulez utiliser uniquement curl, vous pouvez essayer avec -w '%{url_effective}' qui imprime l’URL après une chaîne de redirection (suivi de curl si vous l’invoquez avec -L). Donc, par exemple

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

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

2
Mapio

Je veux télécharger les versions du README.md fichier dans la description du référentiel. Là, je ne peux pas exécuter JavaScript.

Je peux ajouter des liens comme ceux-ci au README ou aux pages github de tous mes référentiels:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Télécharge le dernier fichier de version à partir du référentiel.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Ceci fonctionne parce que le référent JavaScript est défini et que le référentiel à télécharger est déterminé via document.referrer. Ainsi, le lien fonctionnera également pour les fourchettes.

Vous pouvez trouver le code source ici , fourchez ou utilisez simplement mon dépôt.

1
User

Dans le cas où le référentiel utilise uniquement des balises au lieu de release - cf. jQuery - les solutions qui reposent sur une URL ne fonctionnent pas.

Au lieu de cela, vous devez interroger toutes les balises, les trier et construire l'URL de téléchargement. J'ai implémenté une telle solution pour le langage Go et le référentiel jQuery: Lien vers Github .

Peut-être que cela aide quelqu'un.

0
SommerEngineering