Existe um link para o GitHub para baixar um arquivo na versão mais recente de um repositório?

137

Usando o recurso Release do GitHub , é possível fornecer um link para baixar uma versão específica do software publicado. No entanto, toda vez que um lançamento é feito, a página gh também precisa ser atualizada.

Existe uma maneira de obter um link para um arquivo específico, independentemente da versão mais recente de um software?

por exemplo, este seria um link estático:

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

O que eu gostaria é algo como:

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

NOTA: A diferença entre esta pergunta e a versão mais recente do GitHub é que esta pergunta solicita especificamente o acesso ao arquivo, não a página de versão mais recente do GitHub

Christian Rondeau
fonte
1
Isso é suportado nativamente pelo Github agora (com uma pequena diferença no formato do URL). Veja stackoverflow.com/questions/24987542/…
wisbucky

Respostas:

38

Alguns anos atrasado, mas acabei de implementar um redirecionamento simples para dar suporte https://github.com/USER/PROJECT/releases/latest/download/package.zip. Isso deve ser redirecionado para o último package.ziprecurso de liberação marcado . Espero que seja útil!

Joshua Peek
fonte
2
Documentado em help.github.com/en/articles/linking-to-releases : se desejar vincular diretamente a um download do seu recurso de versão mais recente, você pode vincular a / owner / name / releases / latest / download / asset -name.zip
Liam
4
No entanto, seria útil se esse recurso funcionasse com nomes de ativos com versão.
Liam
3
Note que a ordem é comutada .../releases/latest/download/...vs .../releases/download/v0.0.0/.... Você não pode simplesmente substituir v0.0.0por latestno lugar.
wisbucky
2
@ Joshua Peek Talvez você possa estender isso para expandir "ÚLTIMOS" no nome do ativo para que seja a string da versão? Isso o tornaria útil para ativos com números de versão em seus nomes.
Jwatt #
Que tal baixar o código fonte mais recente? Qual é o nome do ativo nesse caso?
skd 21/07
59

Solução Linux para obter o link de download de ativos da versão mais recente (funciona apenas se a release tiver apenas um ativo)

curl -s https://api.github.com/repos/boxbilling/boxbilling/releases/latest | grep browser_download_url | cut -d '"' -f 4
Putna
fonte
7
Um grep adicional no pipeline encontrará o arquivo para sua distribuição e arquitetura. Para o editor de texto atom no 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
Não há mais browser_download_url. Você pode usar tarball_url agora. 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 para browser_download_url ainda funciona para mim.
Léo Lam
@ léo-lam Você está certo. Apenas se você não possui ativos, pode usar o tarball_url para obter o código-fonte.
maikel
Você só pode carregar a versão mais recente para evitar | head -n 1 api.github.com/repos/boxbilling/boxbilling/releases/latest
ya.teck
29

Você pode fazer uma solicitação ajax para obter o URL de download da versão mais recente usando a API de versões do GitHub . Também mostra quando foi lançado e a contagem de downloads:

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 definir o URL do botão padrão para a página de lançamentos (como https://github.com/ShareX/ShareX/releases/latest ), portanto, se o navegador não suportar ajax (ou javascript) ou se for muito lento para obter o URL, o botão de download ainda funcionará.

Quando a solicitação do Ajax for concluída, o URL deste botão mudará automaticamente para um URL de download direto.

Editar:

Também fiz uma página de downloads que mostra vários lançamentos que você pode encontrar aqui: https://getsharex.com/downloads/

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

Jaex
fonte
Legal. Você sabe por que isso pode não estar funcionando? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte
Porque você não tem nenhum lançamento. Verifique: api.github.com/repos/DataTables/DataTables/releases
Jaex
Funky ... github.com/DataTables/DataTables/releases mostra vários lançamentos. Deve haver alguma ambiguidade lá.
Volte
Não, essas são apenas tags. Não há lançamentos.
MrD 18/01/19
2
github.com/jquery/jquery/releases eles não têm nenhum release . São apenas tags de versão.
Jaex 25/05
15

Na linha de comando, usando curle jq, recupera o primeiro arquivo da versão mais recente :

curl -s https://api.github.com/repos/porjo/staticserve/releases/latest | \
  jq --raw-output '.assets[0] | .browser_download_url'
IanB
fonte
1
jq --raw-outputé uma maneira mais limpa de descartar as aspas. Se você quer apenas o mais recente, é mais barato buscar .../releases/lateste largar o .[0] | . Mas buscar todos os lançamentos permite consultas gosta jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin
Obrigado Beni, eu ampliei isso ao pegar o último docker-compose 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 ,. O final foi a mágica e o uso do arco me permite ignorar os arquivos what.sha256 que normalmente estão presentes sem fazer |head -n 1.
dragon788
8

Outra solução Linux usando curl e wget para baixar um único arquivo binário da página de lançamento mais recente

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

Explicação:

curl -s -L é baixar silenciosamente o HTML mais recente da versão (após o redirecionamento a seguir)

egrep -o '...' usa regex para encontrar o arquivo que você deseja

wget --base=http://github.com/ -i - converte o caminho relativo do pipeline em URL absoluto

e -O scollectordefine o nome do arquivo desejado.

poderá adicionar -Nao download apenas se o arquivo for mais recente, mas o S3 estava apresentando um erro 403 Proibido.

Greg Bray
fonte
3
Meu objetivo é criar um link em um site que sempre aponte para a versão mais recente. Um comando linux não permitirá isso.
Christian Rondeau
1
Era isso que eu estava procurando, mas você precisa ter os caracteres de escape corretos para curingas e pontos ao usar grep.
T. Thomas
@TdotThomas graças, essa é a dica que eu precisava para obter os números de versão semver para escapar dos períodos \.por exemplo 2.2.0 necessário/download/[0-9\.]*/
Jeff Puckett
Não, não faz. Nenhum caractere de escape. Mas eu iria presumo um opcional vcomo prefixo, como um tag v0.11.0. Basta inserir 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 scollectorsua CLI e ela funciona perfeitamente. Obrigado Greg !!
MS Berends
7

Como observado anteriormente, jq é útil para esta e outras APIs REST .

tl; dr - mais detalhes abaixo

Supondo que você queira a versão 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"

Solução para liberações de átomos

Observe que cada repositório pode ter maneiras diferentes de fornecer o artefato desejado, portanto, demonstrarei um átomo bem comportado .

Obtenha os nomes dos ativos 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
...

Obtenha o URL de download para o ativo desejado

Abaixo atom-mac é o meu ativo desejado via 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

Faça o download do artefato

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

jq Playground

A sintaxe jq pode ser difícil. Aqui está um playground para experimentar o jqacima: https://jqplay.org/s/h6_LfoEHLZ

Segurança

Você deve tomar medidas para garantir a validade do artefato baixado via sha256sum e gpg , se possível.

Mike D
fonte
7

Uma solução usando o wget (interno) para obter o conteúdo HTML, filtre-o para o arquivo zip (com egrep) e faça o download do arquivo zip (com o wget externo).

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

Basta usar um dos URLs abaixo para fazer o download da versão mais recente: (tirou os URLs do projeto de cobrança de caixa, por exemplo): https://api.github.com/repos/boxbilling/boxbilling/releases

Faça o download da versão mais recente como zip: https://api.github.com/repos/boxbilling/boxbilling/zipball

Faça o download da versão mais recente como tarball: https://api.github.com/repos/boxbilling/boxbilling/tarball

Clique em um dos URLs para baixar a versão mais recente instantaneamente. Enquanto escrevi estas linhas, atualmente é: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

UPDATE: Encontrei outro URL nos meus arquivos de log (ref. Ao exemplo acima) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master

Lahmizzar
fonte
4
esses são repos não libera
Wobbles
5

Não é possível de acordo com o suporte do GitHub a partir de 23/05/2018

Entre em contato com [email protected] em 2018-05-23 com a mensagem:

Você pode apenas confirmar que não há outra maneira além de mexer com a API atualmente?

e eles responderam:

Agradecemos seu contato. Recomendamos o uso da API para buscar a versão mais recente, pois essa abordagem é estável, documentada e não está sujeita a alterações em breve:

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

Também continuarei acompanhando isso em: https://github.com/isaacs/github/issues/658

Solução Python sem nenhuma dependência

Robusto e 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'])

Veja também:

Considere também pré-lançamentos

/latestnão vê pré-lançamentos, mas é fácil, pois /releasesmostra o último mais recente primeiro:

#!/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 adicionou uma nova foto
fonte
3

A página de ajuda Vinculando a versões menciona um botão "Última versão", mas isso não gera um link para download.

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

Para isso, é necessário obter a tag mais recente primeiro (como mencionado em " URL do GitHub para a versão mais recente do arquivo de 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
VonC
fonte
2
Isso ainda requer o envio de uma nova versão da gh-pagesramificação sempre que uma nova versão é feita; o objetivo é ter um link estático que eu possa usar para apenas "consultar a versão mais recente". No momento, minha melhor opção é apenas consultar a página de lançamentos.
Christian Rondeau
@ChristianRondeau Eu concordo. Não vi em nenhum lugar da API uma maneira de referenciar diretamente o URL completo do arquivo "mais recente".
VonC 28/07
Ainda assim, obrigado pela dica; se não houver respostas melhores, provavelmente terminarei fazendo um script para atualizar as páginas gh usando seu script.
Christian Rondeau
2

em PHP - redirecione para o download da versão mais recente. Basta colocar no seu espaço na 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
fonte
2

Se você quiser usar apenas curlvocê pode tentar com -w '%{url_effective}'que imprime o URL após uma cadeia de redirecionamento (seguida por curl se você o chamar -L). Então, por exemplo

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

saídas https://github.com/github-tools/github/releases/tag/v3.1.0.

Mapio
fonte
2

O Github agora suporta links estáticos para baixar arquivos individuais da versão mais recente: https://help.github.com/en/articles/linking-to-releases

https://github.com/USER/PROJECT/releases/latest/download/package.zip
Kaloyan Raev
fonte
A mesma resposta já foi publicada há 6 meses: stackoverflow.com/questions/24987542/…
wisbucky 18/09/19
Obrigado por trazer isso à minha atenção @wisbucky, então o demiti, pois parecia uma implementação personalizada de um desenvolvedor, não de alguém do StackOverflow!
Christian Rondeau
2

Como a maioria visitar esta pergunta, eu estava absolutamente frustrado com encontrar uma maneira de baixar totalmente automatizar o ÚLTIMAS versão de versão ou um repo no Github. O benefício desta solução é que você não precisa especificar nenhum número de release ou tag; ele apenas agarra o MAIS RECENTE .

Realizei meus testes usando o seguinte usuário e repositório do Github:

" f1linux " = Usuário do Github
" pi-ap " = Repo

O nome do diretório arbitrário no qual o repositório é salvo é definido em:

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

DIRETO:

Usando o Firefox " Web Developer Tools" (3 bares no canto superior direito), na " Rede de seção" Eu encontrei https://api.github.comfoi redirecionando para https://codeload.github.com, assim, canalizando o curlque tareu era capaz de pegar o último repo versionadas e guardá-lo para um nome previsível assim poderia ser operado em:

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

INDIRETO:

Depois de obter downloads totalmente automatizados da versão mais recente usando um URL DIRECT , voltei minha atenção para conseguir o mesmo com o redirecionamento do Github:

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

Método preferido:

No entanto, observe o comentário de Von abaixo que INDIRETO é o método preferido

Validação adicional:

Para garantir que meus resultados fossem reproduzíveis em outros repositórios de versão do Github, os mesmos testes foram executados com sucesso para o doctlkit de ferramentas API da Digital Ocean (que foi o que iniciou todo o exercício!):

Ambos DIRETA e INDIRETA trabalho usando a mesma forma que acima, apenas mudando o nome de usuário e repo:

DIRETO:

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

INDIRETO:

curl -L https://api.github.com/repos/digitalocean/doctl/tarball | tar xzvf - --one-top-level="doctl" --strip-components 1
F1Linux
fonte
Interessante. Votado. Eu não estava ciente sobre o carregamento de código, embora o uso da API ainda seja recomendado: stackoverflow.com/a/60198721/6309
VonC
Inicialmente, deparei-me com o redirecionamento e, como observado na resposta, as ferramentas "Web Developer" do Firefox me levaram ao caminho certo. Não foi possível parar por aí, porém, tive que fazê-lo funcionar com o redirecionamento. Obrigado pela votação - mais obrigada!
F1Linux 30/03
1
@VonC Acabei de adicionar seu feedback à resposta. Eu não tinha consciência disso. Obrigado por apontar isso!
F1Linux 30/03
1

Quero baixar os lançamentos do README.mdarquivo na descrição do repositório. Lá, não consigo executar JavaScript.

Posso adicionar links como estes ao arquivo README ou às páginas do github para todos os meus repositórios:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Faz o download do arquivo de versão mais recente do repositório.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Isso funciona porque o referenciador JavaScript está definido e o repositório para download é determinado document.referrer. Assim, o link também funcionará para garfos.

Você pode encontrar o código fonte aqui , garfo ou apenas usar meu repositório.

Do utilizador
fonte
1
Essa é uma ideia bastante inteligente :) não funcionará ao compartilhar links ou usar curl ou afins, mas essa ideia pode ser feita nas páginas do github do projeto.
Christian Rondeau 29/04
1
Desde que isso seja possível como um site JavaScript, também é possível escrever um serviço que redireciona. download-service.com/organization/repository/artifact
Usuário
0

Caso o repositório esteja usando apenas tags em vez de release - cf. jQuery - as soluções que com base em uma URL não funcionam.

Em vez disso, você deve consultar todas as tags, classificá-las e construir o URL de download. Eu implementei essa solução para o idioma Go e o repositório jQuery: Link to Github .

Talvez isso ajude alguém.

SommerEngineering
fonte