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.
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
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
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
À 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'
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.
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!
Comme indiqué précédemment, jq est utile pour cela et d'autres API REST .
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"
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 .
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
...
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
curl -LO "https://github.com/atom/atom/releases/download/v1.15.0/atom-mac.Zip"
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
Vous devez prendre des mesures pour garantir la validité de l'artefact téléchargé via sha256sum et gpg , si possible.
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)
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
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
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);
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
.
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>
https://niccokunzmann.github.io/download_latest/<FILE>
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.
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.