최신 리포지토리 릴리스에서 파일을 다운로드하기위한 GitHub에 대한 링크가 있습니까?


137

GitHub의 릴리스 기능을 사용 하면 게시 된 소프트웨어의 특정 버전을 다운로드 할 수있는 링크를 제공 할 수 있습니다. 그러나 릴리스 할 때마다 gh-page도 업데이트해야합니다.

최신 버전의 소프트웨어가 무엇이든 특정 파일에 대한 링크를 얻는 방법이 있습니까?

예를 들어, 이것은 정적 링크입니다.

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

내가 원하는 것은 다음과 같습니다.

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

참고 :이 질문과 GitHub 최신 릴리스 의 차이점은이 질문 은 GitHub 최신 릴리스 페이지가 아니라 파일에 대한 액세스를 요청한다는 것입니다


1
이것은 현재 Github에서 기본적으로 지원합니다 (URL 형식에 약간의 차이가 있음). 참조 stackoverflow.com/questions/24987542/...
wisbucky

답변:


38

몇 년 늦었지만 지원을위한 간단한 리디렉션을 구현했습니다 https://github.com/USER/PROJECT/releases/latest/download/package.zip. 최신 태그가 지정된 package.zip릴리스 자산으로 리디렉션되어야합니다 . 그것이 편리하기를 바랍니다!


2
help.github.com/en/articles/linking-to-releases에 문서화되어 있습니다 : 최신 릴리스 자산의 다운로드에 직접 링크하려면 / owner / name / releases / latest / download / asset에 링크하십시오 -name.zip
Liam

4
그러나이 기능이 버전이 지정된 자산 이름과 함께 작동하면 도움이됩니다.
Liam

3
순서는 .../releases/latest/download/...vs 로 바뀝니다 .../releases/download/v0.0.0/.... 당신은 단순히 대체 할 수 없습니다 v0.0.0latest장소에.
wisbucky

2
@Joshua Peek 어쩌면 이것을 확장하여 자산 이름에서 "LATEST"를 버전 문자열로 확장 할 수 있습니까? 이름에 버전 번호가있는 자산에 유용합니다.
jwatt

최신 소스 코드를 다운로드하는 것은 어떻습니까? 이 경우 자산의 이름은 무엇입니까?
skd

59

최신 릴리스 자산 다운로드 링크를 얻는 Linux 솔루션 (릴리스에 하나의 자산 만있는 경우에만 작동)

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

7
파이프 라인에 하나의 추가 grep이 배포 및 아키텍처에 대한 파일을 찾습니다. 를 들어 원자 64 비트 우분투에서 텍스트 편집기 :curl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
호브

3
더 이상 browser_download_url이 없습니다. 이제 tarball_url을 사용할 수 있습니다. curl -s https://api.github.com/repos/git-ftp/git-ftp/releases | grep tarball_url | head -n 1 | cut -d '"' -f 4
maikel

4
browser_download_url에 대한 @maikel grepping은 여전히 ​​저에게 효과적입니다.
Léo Lam

@ léo-lam 당신이 맞아요. 자산이없는 경우 tarball_url을 사용하여 소스 코드를 얻을 수 있습니다.
maikel


29

GitHub Releases API를 사용하여 최신 릴리스 다운로드 URL을 얻기 위해 ajax 요청을 수행 할 수 있습니다 . 또한 출시시기와 다운로드 횟수도 표시됩니다.

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>

브라우저가 아약스 (또는 자바 스크립트)를 지원하지 않거나 너무 느릴 경우 기본 버튼 URL을 릴리스 페이지 ( https://github.com/ShareX/ShareX/releases/latest 등 ) 로 설정하는 것이 중요 합니다. URL을 얻으면 다운로드 버튼이 계속 작동합니다.

Ajax 요청이 완료되면이 버튼의 URL이 자동으로 직접 다운로드 URL로 변경됩니다.

편집하다:

또한 여기에서 찾을 수있는 여러 릴리스를 보여주는 다운로드 페이지를 만들었습니다. https://getsharex.com/downloads/

그것의 소스 코드 : https://github.com/ShareX/sharex.github.io/blob/master/js/downloads.js


멋있는. 이것이 작동하지 않는 이유를 알고 있습니까? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte

릴리스가 없기 때문입니다. 확인 : api.github.com/repos/DataTables/DataTables/releases
Jaex

펑키 ... github.com/DataTables/DataTables/releases 는 많은 릴리스를 보여줍니다. 거기에 약간의 모호성이 있어야합니다.
Volte

아니요, 이들은 태그 일뿐입니다. 릴리스가 없습니다.
MrD

2
github.com/jquery/jquery/releases 릴리스가 없습니다. 버전 태그 일뿐입니다.
Jaex

15

curland를 사용하여 명령 행 에서 최신 릴리스 jq첫 번째 파일을 검색합니다 .

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

1
jq --raw-output따옴표를 삭제하는 더 확실한 방법입니다. 최신 버전 만 원하면을 가져 .../releases/latest오고 떨어 뜨리는 것이 더 저렴 합니다 .[0] | . 그러나 모든 릴리스를 가져 jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'
오면 다음

감사합니다 Beni, 나는 최신 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 . 끝은 마법이었고 아치를 사용하면 일반적으로 수행하지 않고 일반적으로 존재하는 whatever.sha256 파일을 무시할 수 있습니다 |head -n 1.
dragon788

8

curl 및 wget을 사용하여 최신 릴리스 페이지 에서 단일 바이너리 파일을 다운로드하는 다른 Linux 솔루션

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

설명:

curl -s -L 리디렉션 후 최신 릴리스 HTML을 자동으로 다운로드하는 것입니다.

egrep -o '...' 정규식을 사용하여 원하는 파일을 찾습니다.

wget --base=http://github.com/ -i - 파이프 라인에서 상대 URL로 상대 경로를 변환

그리고 -O scollector원하는 파일 이름을 설정합니다.

-N파일이 최신이지만 S3에서 403 Forbidden 오류가 발생한 경우 다운로드에만 추가 할 수 있습니다 .


3
내 목표는 항상 최신 버전을 가리키는 웹 사이트에 링크를 만드는 것입니다. 리눅스 명령은 그것을 허용하지 않습니다.
Christian Rondeau

1
이것이 내가 찾던 것이지만 grep을 사용할 때 와일드 카드와 점에 대해 올바른 이스케이프 문자가 있는지 확인해야합니다.
T. Thomas

@TdotThomas 고마워, 그것은 기간을 탈출하기 위해 semver 릴리스 번호에 필요한 힌트입니다. \.예 : 2.2.0 필요/download/[0-9\.]*/
Jeff Puckett

아닙니다. 탈출 문자가 없습니다. 하지만 난 것이다 옵션을 추정 v태그와 같은 접두사로 v0.11.0. 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에 입력 하면 완벽하게 작동합니다. 고마워, 그렉 !!
MS Berends

7

앞에서 언급했듯이 jq 는이 API 와 다른 REST API에 유용합니다 .

tl; dr-자세한 내용은 아래를 참조하십시오

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"

원자 방출을위한 솔루션

참고 난에 대한 설명 있도록 각각의 repo가 원하는 유물을 제공하는 여러 가지 방법이있을 수와 같은 하나 잘 행동 원자를 .

게시 된 자산의 이름을 가져옵니다

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

원하는 자산의 다운로드 URL을 가져옵니다

atom-mac 아래 는 jq를 통해 원하는 자산입니다.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"

jq 놀이터

jq 구문이 어려울 수 있습니다. jq위의 실험을위한 놀이터는 다음과 같습니다 . https://jqplay.org/s/h6_LfoEHLZ

보안

가능한 경우 sha256sum 및 gpg 를 통해 다운로드 한 아티팩트의 유효성을 보장하기위한 조치를 취해야 합니다.


7

(내부) wget을 사용하여 HTML 내용을 가져 와서 zip 파일 (egrep 포함)으로 필터링 한 다음 zip 파일 (외부 wget 포함)을 다운로드하십시오.

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

6

아래 URL 중 하나를 사용하여 최신 릴리스를 다운로드하십시오 (예 : boxbilling 프로젝트에서 URL을 가져옴) : https://api.github.com/repos/boxbilling/boxbilling/releases

최신 릴리스를 zip으로 다운로드하십시오. https://api.github.com/repos/boxbilling/boxbilling/zipball

최신 릴리스를 tarball로 다운로드하십시오. https://api.github.com/repos/boxbilling/boxbilling/tarball

URL 중 하나를 클릭하면 최신 릴리스를 즉시 다운로드 할 수 있습니다. 이 줄을 쓰면서 현재는 다음과 같습니다. boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

업데이트 : 내 로그 파일에서 다른 URL을 찾았습니다 (위 예 참조) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master


4
그것들은 repos not release입니다
Wobbles

5

2018-05-23 현재 GitHub 지원에 따르면 불가능합니다

메시지와 함께 2018-05-23에 support@github.com에 문의하십시오.

현재 API를 망쳐 놓는 것 외에 다른 방법이 없다는 것을 확인할 수 있습니까?

그리고 그들은 대답했다 :

연락해 주셔서 감사합니다. 이 방법은 안정적이고 문서화되어 있으며 곧 변경 될 수 없으므로 API를 사용하여 최신 릴리스를 가져 오는 것이 좋습니다.

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

https://github.com/isaacs/github/issues/658 에서 계속 추적합니다.

의존성이없는 파이썬 솔루션

견고하고 휴대 성 :

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

또한보십시오:

시험판 고려

/latest시험판을 볼 수 없지만 /releases최신판을 먼저 보여주기 때문에 쉽게 할 수 있습니다 .

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

링킹 릴리스 도움말 페이지는 "최신 릴리스"버튼을 언급하지,하지만 그건 당신에게 다운로드 링크를하지 않습니다.

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

이를 위해서는 먼저 최신 다운로드 태그가 필요합니다 ( " 다운로드 파일 의 최신 릴리스에 대한 GitHub URL ? " 에서 언급 한 바와 같이 ).

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
새로운 버전이 gh-pages출시 될 때마다 새로운 버전의 브랜치 를 푸시해야합니다 . 목표는 "최신 버전을 참조하기"위해 사용할 수있는 정적 링크를 갖는 것입니다. 지금 가장 좋은 방법은 릴리스 페이지를 참조하는 것입니다.
Christian Rondeau

@ChristianRondeau 동의합니다. API의 어느 곳에서도 "최신"릴리스 아카이브 전체 URL을 직접 참조하는 방법을 보지 못했습니다.
VonC

여전히 팁을 주셔서 감사합니다. 더 나은 답변을 제공하지 않으면 아마도 스크립트를 사용하여 gh 페이지를 업데이트하는 스크립트를 작성하게 될 것입니다.
Christian Rondeau

2

PHP에서-최신 릴리스 다운로드로 리디렉션하십시오. 웹 사이트에 올려 놓기 만하면됩니다

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

당신이 그것을 사용하고 싶다면 리디렉션 체인 후에 URL을 인쇄하여 curl시도 할 수 있습니다 -w '%{url_effective}'(로 호출하면 curl이 뒤 따릅니다 -L). 예를 들어

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

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


2

Github은 이제 최신 릴리즈에서 개별 파일을 다운로드 할 수있는 정적 링크를 지원합니다 : https://help.github.com/en/articles/linking-to-releases

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

같은 답변이 6 개월 전에 이미 게시되었습니다 : stackoverflow.com/questions/24987542/…
wisbucky

@wisbucky에 관심을 가져 주셔서 감사합니다 .StackOverflow의 누군가가 아닌 개발자의 맞춤형 구현처럼 들렸 기 때문에 그것을 기각했습니다!
Christian Rondeau

2

이 질문을 가장 많이 방문한 것처럼, 나는 최신 버전의 릴리스 또는 Github의 리포지토리의 다운로드를 완전히 자동화하는 방법을 찾는 것에 완전히 좌절했습니다 . 이 솔루션의 장점은 릴리스 또는 태그 번호를 지정할 필요가 없다는 것입니다 . 최신 버전 만 가져옵니다 .

다음 Github 사용자 및 저장소를 사용하여 테스트를 수행했습니다.

" f1linux "= Github 사용자
" pi-ap "= Repo

저장소가 저장된 임의의 디렉토리 이름은 다음과 같이 설정됩니다.

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

곧장:

파이어 폭스의 "사용하여 웹 개발자 은"에서 "도구 (오른쪽 상단 모서리에있는 3 개 바) 네트워크 내가 발견"섹션 https://api.github.com로 리디렉션 된 https://codeload.github.com배관에 의해, 그래서 curltar나는 것은 그래서 예측 이름으로 최신 버전의 repo과 저장을 잡을 수 있었다 그것은 작동 할 수 있습니다 :

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

간접 :

DIRECT URL을 사용하여 최신 버전의 릴리스를 완전히 자동으로 다운로드 한 후 Github의 리디렉션을 사용하여 동일한 버전 을 달성하는 데 관심을 기울 였습니다 .

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

선호하는 방법 :

그러나 아래 VON 의 의견에 따르면 INDIRECT선호되는 방법입니다.

추가 검증 :

내 결과를 다른 버전의 Github 저장소로 재현 할 수 있도록 Digital Ocean의 동일한 테스트가 성공적으로 수행되었습니다. doctl api 툴킷에 (실제로 전체 연습을 시작했습니다).

모두 직접간접 단지 사용자 이름 및 REPO을 변경, 위와 같은 양식을 사용하여 작업 :

곧장:

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

간접 :

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

흥미 롭군 공감. API를 사용하는 것이 여전히 권장되지만 코드로드에 대해 알지 못했습니다. stackoverflow.com/a/60198721/6309
VonC

처음에는 리디렉션으로 슬픔에 빠졌으며 Firefox의 "웹 개발자"도구에서 언급했듯이 올바른 길을 가고 있습니다. 그래도 거기서 멈추지 않고 리디렉션 작업을 수행해야했습니다. 공감하는 분들께 감사드립니다!
F1Linux

1
@VonC 방금 귀하의 의견을 답변에 추가했습니다. 나는 이것을 전혀 몰랐다. 지적 해 주셔서 감사합니다!
F1Linux

1

README.md리포지토리 설명 의 파일에서 릴리스를 다운로드하고 싶습니다 . 거기에서 JavaScript를 실행할 수 없습니다.

모든 리포지토리의 README 파일 또는 github 페이지에 다음과 같은 링크를 추가 할 수 있습니다.

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    저장소에서 최신 릴리스 파일을 다운로드합니다.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    자바 스크립트 리퍼러가 설정되고 다운로드 할 리포지토리가를 통해 결정되기 때문에 작동합니다 document.referrer. 따라서 링크는 포크에서도 작동합니다.

소스 코드는 여기 에서 찾을 수 있습니다 . 포크 또는 내 레포를 사용 하십시오 .


1
그것은 꽤 영리한 아이디어입니다 :) 링크를 공유하거나 curl 등을 사용할 때 작동하지 않지만이 아이디어는 프로젝트의 github 페이지에서 수행 할 수 있습니다.
Christian Rondeau

1
이것이 JavaScript 웹 사이트로서 가능하기 때문에 리디렉션을 수행하는 서비스를 작성할 수도 있습니다. download-service.com/organization/repository/artifact
사용자

0

repo가 ​​release 대신 태그 만 사용하는 경우-cf. jQuery-하나의 URL을 기반으로하는 솔루션이 작동하지 않습니다.

대신 모든 태그를 쿼리하고 정렬 한 후 다운로드 URL을 구성해야합니다. Go 언어와 jQuery 리포지토리에 대한 솔루션을 구현했습니다 : Link to Github .

아마도 이것은 누군가를 도울 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.