Bir deponun en son sürümünde bir dosyayı indirmek için GitHub'a bir bağlantı var mı?


139

GitHub'ın Release özelliğini kullanarak , yayınlanan yazılımın belirli bir sürümünü indirmek için bir bağlantı sağlamak mümkündür. Ancak, her sürüm yayınlandığında, gh sayfasının da güncellenmesi gerekir.

Bir yazılımın en son sürümü ne olursa olsun belirli bir dosyaya bağlantı almanın bir yolu var mı?

örneğin, bu statik bir bağlantı olacaktır:

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

Ne istiyorum gibi bir şey:

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

NOT: Bu soru ve GitHub'ın en son sürümü arasındaki fark , bu sorunun özellikle GitHub'ın en son sürüm sayfasına değil, dosyaya erişmesini istemesidir.


1
Bu artık yerel olarak Github tarafından desteklenmektedir (URL biçiminde küçük bir farkla). Bkz. Stackoverflow.com/questions/24987542/…
wisbucky

Yanıtlar:


38

Birkaç yıl geç, ama sadece basit bir yönlendirmeyi destekledim https://github.com/USER/PROJECT/releases/latest/download/package.zip. Bunun, en son etiketli package.zipsürüm öğesine yönlendirilmesi gerekir . Umarım kullanışlı!


3
Belgelenmiştir help.github.com/en/articles/linking-to-releases : Eğer için / sahibi ya bağlayarak son sürüm varlığın bir indirmek için doğrudan bağlantı isterseniz / ad / bültenleri / son / indir / varlık -name.zip
Liam

4
Bununla birlikte, bu özelliğin sürümlendirilmiş öğe adlarıyla çalışması yararlı olabilir.
Liam

3
Siparişin .../releases/latest/download/...vs olarak değiştirildiğine dikkat edin .../releases/download/v0.0.0/.... Sadece yerini alamaz v0.0.0ile latestyerinde.
wisbucky

2
@Joshua Peek Belki de varlık adındaki "LATEST" değerini sürüm dizesi olarak genişletmek için genişletebilirsiniz? Bu, adlarında sürüm numaralarına sahip varlıklar için yararlı olur.
jwatt

En son kaynak kodunu indirmeye ne dersiniz? Bu durumda varlığın adı nedir?
skd

59

En son sürüm varlığı indirme bağlantısını almak için Linux çözümü (yalnızca sürümde yalnızca bir öğe varsa çalışır)

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

7
Boru hattındaki ek bir grep, dağıtımınız ve mimariniz için dosyayı bulur. İçin atom 64 bit Ubuntu üzerinde metin editörü:curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
ocak

3
Artık browser_download_url yok. Şimdi tarball_url kullanabilirsiniz. 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 tarayıcı_download_url için grepping hala benim için çalışıyor.
Léo Lam

@ léo-lam Haklısın. Varlıklarınız yoksa, kaynak kodu almak için tarball_url kullanabilirsiniz.
maikel


29

GitHub Sürümler API'sını kullanarak en son sürüm indirme URL'sini almak için bir ajax isteği yapabilirsiniz . Ayrıca ne zaman yayınlandığını ve indirme sayısını gösterir:

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>

Varsayılan düğme URL'sini sürümler sayfasına ( https://github.com/ShareX/ShareX/relX/releases/latest gibi ) ayarlamanız önemlidir, böylece tarayıcı ajax'ı (veya javascript'i) desteklemiyorsa veya çok yavaşsa URL'yi al, indirme düğmesi yine de çalışır.

Ajax isteği tamamlandığında, bu düğmenin URL'si otomatik olarak doğrudan indirme URL'sine dönüşecektir.

Düzenle:

Ayrıca burada bulabileceğiniz birden fazla sürümü gösteren bir indirme sayfası hazırladım: https://getsharex.com/downloads/

Kaynak kodu: https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js


Güzel. Bunun neden işe yaramayabileceğini biliyor musunuz? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte

Çünkü hiç sürümünüz yok. Kontrol edin: api.github.com/repos/DataTables/DataTables/releases
Jaex

Funky ... github.com/DataTables/DataTables/releases bir sürü sürümü gösterir. Orada bir belirsizlik olmalı.
Volte

Hayır, bunlar yalnızca etiketler. Yayın yok.
MrD

2
github.com/jquery/jquery/releases hiçbir sürümü yok. Sadece sürüm etiketleri.
Jaex

15

Komut satırından curlve jqtuşlarını kullanarak en son sürümün ilk dosyasını alır :

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

1
jq --raw-outputtırnak işaretlerini bırakmanın daha temiz bir yoludur. Sadece en son istiyorsanız, getirmek .../releases/latestve bırakmak daha ucuzdur .[0] | . Ama tüm sürümleri almak gibi sorgulara izin verir jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin

Teşekkürler Beni, en son liman işçisini bestelemek için bunu genişlettim 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 . Endwith sihirdi ve arch'ı kullanmak, genellikle yapmadan mevcut olan whatever.sha256 dosyalarını görmezden gelmemi sağlar |head -n 1.
dragon788

8

En son sürüm sayfasından tek bir ikili dosyayı indirmek için curl ve wget kullanan başka bir Linux çözümü

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

Açıklama:

curl -s -L en son sürüm HTML'sini sessizce indirmektir (yönlendirmeyi izledikten sonra)

egrep -o '...' istediğiniz dosyayı bulmak için normal ifade kullanır

wget --base=http://github.com/ -i - göreceli yolu ardışık düzenden mutlak URL'ye dönüştürür

ve -O scollectoristediğiniz dosya adını ayarlar.

-Nyalnızca dosya daha yeni ancak S3 403 Yasak hatası veriyorsa indirmeye ekleyebilir .


3
Amacım bir web sitesinde her zaman en son sürüme işaret eden bir bağlantı yapmak. Bir linux komutu buna izin vermeyecektir.
Christian Rondeau

1
Aradığım şey buydu ama grep kullanırken joker karakterler ve noktalar için doğru kaçış karakterlerine sahip olduğunuzdan emin olmalısınız.
T. Thomas

@TdotThomas teşekkürler, semver sürüm numaralarının noktalardan kaçması için gerekli olan ipucu bu, \.örneğin 2.2.0 gerekli/download/[0-9\.]*/
Jeff Puckett

Hayır. Kaçış karakteri yok. Ama olur opsiyonel tahmin vbir etiket gibi, önek olarak v0.11.0. Sadece 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 scollectorCLI'nizi girin ve mükemmel çalışıyor. Teşekkür ederim Greg !!
MS Berends

7

Daha önce belirtildiği gibi, jq bu ve diğer REST API'leri için kullanışlıdır .

tl; dr - daha fazla ayrıntı aşağıda

MacOS sürümünü istediğinizi varsayarsak :

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"

Atom salımları için çözüm

Not bir için gösterecek, böylece her Repo istenen objeyi sağlama farklı şekilde olabilir gibi bir uslu atomu .

Yayınlanan varlıkların adlarını alın

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

İstenen varlık için indirme URL'sini alın

Atom-mac altında benim jq's aracılığıyla istenen varlıkselect(.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

Eseri indirin

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

jq Oyun Alanı

jq sözdizimi zor olabilir. İşte jqyukarıdakileri denemek için bir oyun alanı : https://jqplay.org/s/h6_LfoEHLZ

Güvenlik

Mümkünse , indirilen eserin sha256sum ve gpg aracılığıyla geçerliliğini sağlamak için önlemler almalısınız .


7

HTML içeriğini almak (zip dosyası için (egrep ile)) filtrelemek ve sonra zip dosyasını (dış wget ile) indirmek için (iç) wget kullanan bir çözüm.

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

6

En son sürümü indirmek için aşağıdaki URL'lerden birini kullanın: (örneğin, boxbilling projesinden URL'leri aldı): https://api.github.com/repos/boxbilling/boxbilling/releases

En son sürümü zip olarak indirin: https://api.github.com/repos/boxbilling/boxbilling/zipball

En son sürümü tarball olarak indirin: https://api.github.com/repos/boxbilling/boxbilling/tarball

En son sürümü anında indirmek için URL'lerden birine tıklayın. Bu satırları yazdığım gibi şu anda: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

GÜNCELLEME: Günlük dosyalarımda başka bir URL bulundu (yukarıdaki örneğe bakın) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master


4
bunlar depolar değil
Wobbles

5

2018-05-23 itibariyle GitHub desteğine göre mümkün değil

2018-05-23 tarihinde support@github.com adresine şu mesajla ulaştı:

Şu anda API ile uğraşmaktan başka bir yol olmadığını doğrulayabilir misiniz?

ve cevapladılar:

Bize ulaştığınız için teşekkürler. En son sürümü almak için API'yi kullanmanızı öneririz, çünkü bu yaklaşım istikrarlıdır, belgelenmiştir ve yakında herhangi bir zamanda değişmeyecektir:

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

Bunu takip etmeye de devam edeceğim: https://github.com/isaacs/github/issues/658

Herhangi bir bağımlılığı olmayan Python çözümü

Sağlam ve taşınabilir:

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

Ayrıca bakınız:

Ayrıca ön sürümleri de göz önünde bulundurun

/latestön sürümleri görmez, ancak /releasesen sonuncuyu önce gösterdiğinden bunu yapmak kolaydır :

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

Bağlama sürümlerine yardım sayfası "Son Sürüm" düğmesini söz açabilir, ama bu size bir indirme bağlantısı almaz.

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

Bunun için, öncelikle en son etiketi almak gerekir (belirtildiği gibi " en son sürümü için GitHub adresten indir dosyası ? "):

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
Bu, yeni bir sürüm gh-pagesher yayınlandığında dalın yeni bir versiyonunu zorlamayı gerektirir ; amaç sadece "son sürüme başvurmak" için kullanabileceğim statik bir bağlantıya sahip olmaktır. Şu anda en iyi seçeneğim sadece sürümler sayfasına bakmak.
Christian Rondeau

@ChristianRondeau katılıyorum. Ben API herhangi bir yerde doğrudan "en son" yayın arşiv tam url referans bir yol görmedim.
VonC

Yine de bahşiş için teşekkürler; daha iyi yanıtlar sağlanmadıysa, muhtemelen gh sayfalarını komut dosyanızı kullanarak güncellemek için bir komut dosyası yapacağım.
Christian Rondeau

2

PHP sürümü - en son sürümüne yönlendir. Basitçe web alanınıza koyun

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

Sadece kullanmak curlisterseniz, -w '%{url_effective}'bir yönlendirme zincirinden sonra URL'yi yazdırarak deneyebilirsiniz (bunu çağırırsanız kıvrılma gelir -L). Yani mesela

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

çıktılar https://github.com/github-tools/github/releases/tag/v3.1.0.


2

Github artık en son sürümden tek tek dosyaları indirmek için statik bağlantıları destekliyor: https://help.github.com/en/articles/linking-to-releases

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

Aynı cevap zaten 6 ay önce gönderildi: stackoverflow.com/questions/24987542/…
wisbucky

Bunu dikkatime çektiğin için teşekkürler @ wisbucky, o zaman işten çıkarıldım çünkü StackOverflow'dan değil, bir geliştiriciden özel bir uygulama gibi geldi!
Christian Rondeau

2

Çoğu bu soruyu ziyaret gibi ben kesinlikle tamamen otomatikleştirmek indirilmesi için bir yol bulmakta zorlandığınız oldu SON sürüm sürüm veya Github bir repo. Bu çözümün yararı, herhangi bir sürüm veya etiket numarası belirtmeniz gerekmemesidir - sadece SONLANDIRIR .

Testimi aşağıdaki Github kullanıcı & repo'sunu kullanarak gerçekleştirdim:

" f1linux " = Github Kullanıcısı
" pi-ap " = Repo

Repo'nun kaydedildiği rasgele dizin adı:

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

DOĞRUDAN:

Firefox'un "Kullanarak Web Geliştiricisi " in, "araçlar (sağ üst köşede 3 bar) Ben bulundu" bölümüne https://api.github.comyönlendirme yaparak edildi https://codeload.github.comborularla yüzden, curlhiç tarI yüzden öngörülebilir isme son sürüm repo ve ona tasarrufu kapmak başardı şurada çalıştırılabilir:

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

DOLAYLI:

Bir DIRECT URL'si kullanarak en son sürümün tam otomatik olarak indirilmesini sağladıktan sonra , dikkatimi Github'ın yeniden yönlendirmesiyle aynı hale getirmeye çevirdim:

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

Tercih edilen yol:

Bunun altında Fakat Von yorumuna göre notu memnun DOLAYLI olduğu tercih edilen yöntem

Ek Doğrulama:

Sonuçlarımın diğer sürümlü Github depolarına tekrarlanabilir olmasını sağlamak için aynı testler Digital Ocean'ın doctlapi araç kiti için başarıyla gerçekleştirildi (aslında tüm egzersizi başlatan şey bu!):

Hem DIRECT hem de INDIRECT yukarıdaki ile aynı formu kullanarak çalışır, sadece kullanıcı adını ve repoyu değiştirir:

DOĞRUDAN:

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

DOLAYLI:

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

İlginç. Upvoted. API'nın kullanılması hala önerilse de kod yükünün farkında değildim: stackoverflow.com/a/60198721/6309
VonC

Başlangıçta yönlendirme ile kederle karşılaştım ve cevabında belirtildiği gibi Firefox'un "Web Developer" araçları beni doğru yola soktu. Yine de orada duramadı, yönlendirme ile çalışmak zorunda kaldı. Upvote için teşekkürler - en mecbur!
F1Linux

1
@VonC Sadece cevabınıza görüşlerinizi ekledik. Bundan tamamen habersizdim. Gösterdiğiniz için teşekkürler!
F1Linux

1

README.mdDepodaki açıklamadaki dosyadan çıkan sürümleri indirmek istiyorum . Orada JavaScript çalıştıramıyorum.

Tüm depolarım için README dosyasına veya github sayfalarına böyle bağlantılar ekleyebilirim:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Depodan en son sürüm dosyasını indirir.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Bu, JavaScript yönlendireni ayarlandığı ve indirilecek depo aracılığıyla belirlendiği için çalışır document.referrer. Böylece, bağlantı çatallar için de çalışacaktır.

Kaynak kodunu burada bulabilirsiniz , çatal veya sadece repo'yu kullanın.


1
Bu oldukça zekice bir fikir :) bağlantıları paylaşırken veya kıvırmak veya beğenileri kullanırken işe yaramaz, ancak bu fikir projenin github sayfalarında yapılabilir.
Christian Rondeau

1
Bu bir JavaScript web sitesi olarak mümkün olduğunda, yönlendirme yapan bir hizmet de yazılabilir. download-service.com/organization/repository/artifact
Kullanıcı

0

Reponun release - cf yerine sadece etiketleri kullanması durumunda. jQuery - bir URL'ye dayalı çözümler çalışmaz.

Bunun yerine, tüm etiketleri sorgulamanız, sıralamanız ve indirme URL'sini oluşturmanız gerekir. Go dili ve jQuery repo: Github'a bağlantı için böyle bir çözüm uyguladım .

Belki de bu birisine yardım eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.