Có liên kết đến GitHub để tải xuống tệp trong bản phát hành mới nhất của kho lưu trữ không?


137

Sử dụng tính năng Phát hành của GitHub , có thể cung cấp một liên kết để tải xuống một phiên bản cụ thể của phần mềm được xuất bản. Tuy nhiên, mỗi khi bản phát hành được thực hiện, trang gh cũng cần được cập nhật.

Có cách nào để có được một liên kết đến một tệp cụ thể của bất kỳ phiên bản mới nhất của phần mềm là gì không?

ví dụ: đây sẽ là một liên kết tĩnh:

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

Những gì tôi muốn là một cái gì đó như:

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

LƯU Ý: Sự khác biệt giữa câu hỏi này và bản phát hành mới nhất của GitHub là câu hỏi này đặc biệt yêu cầu quyền truy cập vào tệp, không phải trang phát hành mới nhất của GitHub


1
Điều này được Github hỗ trợ ngay bây giờ (với một chút khác biệt trong định dạng URL). Xem stackoverflow.com/questions/24987542/ khăn
wvducky

Câu trả lời:


37

Một vài năm muộn, nhưng tôi chỉ thực hiện một chuyển hướng đơn giản để hỗ trợ https://github.com/USER/PROJECT/releases/latest/download/package.zip. Điều đó sẽ được chuyển hướng đến package.ziptài sản phát hành được gắn thẻ mới nhất . Hy vọng nó tiện dụng!


1
Tài liệu trên help.github.com/en/articles/linking-to-release : Nếu bạn muốn liên kết trực tiếp đến bản tải xuống của tài sản phát hành mới nhất của mình, bạn có thể liên kết đến / chủ sở hữu / tên / phát hành / mới nhất / tải xuống / tài sản -name.zip
Liam

4
Tuy nhiên, sẽ rất hữu ích nếu tính năng này hoạt động với tên tài sản được phiên bản.
Liam

3
Lưu ý rằng thứ tự được chuyển đổi .../releases/latest/download/...so với .../releases/download/v0.0.0/.... Bạn không thể đơn giản thay thế v0.0.0bằng latesttại chỗ.
wvducky

2
@Joshua Peek Có lẽ bạn có thể mở rộng điều này để mở rộng "MỚI NHẤT" trong tên tài sản thành chuỗi phiên bản? Điều đó sẽ làm cho nó hữu ích cho các tài sản có số phiên bản trong tên của chúng.
jwatt

Còn việc tải mã nguồn mới nhất thì sao? Tên của tài sản trong trường hợp đó là gì?
skd

59

Giải pháp Linux để nhận liên kết tải xuống tài sản phát hành mới nhất (chỉ hoạt động nếu bản phát hành chỉ có một tài sản)

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

7
Một grep bổ sung trong đường ống sẽ tìm thấy tệp cho phân phối và kiến ​​trúc của bạn. Đối với trình soạn thảo văn bản nguyên tử trên Ubuntu 64 bit: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
Không có trình duyệt_doad_url nữa. Bạn có thể sử dụng tarball_url ngay bây giờ. 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 cho browser_doad_url vẫn hoạt động với tôi.
Léo Lam

@ minh-lam Bạn nói đúng. Chỉ cần bạn không có tài sản, bạn có thể sử dụng tarball_url để lấy mã nguồn.
maikel

Bạn chỉ có thể tải bản phát hành mới nhất để tránh | head -n 1 api.github.com/repose/boxbilling/boxbilling/release/latest
ya.teck

29

Bạn có thể thực hiện yêu cầu ajax để nhận URL tải xuống bản phát hành mới nhất bằng cách sử dụng API phát hành GitHub . Nó cũng hiển thị khi nó được phát hành và số lượt tải xuống:

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>

Điều quan trọng là bạn phải đặt URL nút mặc định cho trang phát hành (như https://github.com/ShareX/ShareX/release/latest ) để nếu trình duyệt không hỗ trợ ajax (hoặc javascript) hoặc quá chậm để lấy URL, nút tải xuống sẽ vẫn hoạt động.

Khi yêu cầu Ajax hoàn thành, URL của nút này sẽ tự động thay đổi thành URL tải xuống trực tiếp.

Biên tập:

Tôi cũng đã tạo một trang tải xuống hiển thị nhiều bản phát hành mà bạn có thể tìm thấy ở đây: https://getsharex.com/doads/

Mã nguồn của nó: https://github.com/ShareX/sharex.github.io/blob/master/js/doads.js


Mát mẻ. Bạn có biết tại sao điều này có thể không hoạt động? curl -s https://api.github.com/repos/DataTables/DataTables/releases/latest
Volte

Bởi vì bạn không có bất kỳ bản phát hành nào. Kiểm tra: api.github.com/repose/DataTables/DataTables/release
Jaex

Funky ... github.com/DataTables/DataTables/release hiển thị một loạt các bản phát hành. Phải có sự mơ hồ ở đó.
Volte

Không, đây chỉ là các thẻ. Không có bản phát hành.
MrD

2
github.com/jquery/jquery/release họ không có bất kỳ bản phát hành nào. Nó chỉ là thẻ phiên bản.
Jaex

15

Từ dòng lệnh sử dụng curljq, lấy tệp đầu tiên của bản phát hành mới nhất :

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

1
jq --raw-outputlà một cách sạch hơn để thả dấu ngoặc kép. Nếu bạn chỉ muốn cái mới nhất thì rẻ hơn để lấy .../releases/latestvà thả .[0] | . Nhưng tìm nạp tất cả các bản phát hành cho phép các truy vấn như jq '.[] | .assets[] | .browser_download_url | select(endswith(".deb"))'...
Beni Cherniavsky-Paskin

Cảm ơn Beni, tôi đã mở rộng về điều này vì đã lấy được docker-compose mới nhất , 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 . Endswith là phép thuật và sử dụng vòm cho phép tôi bỏ qua các tập tin any.sha256 thường có mặt mà không cần thực hiện |head -n 1.
dragon788

8

Một giải pháp Linux khác sử dụng curl và wget để tải xuống một tệp nhị phân từ trang phát hành mới nhất

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

Giải trình:

curl -s -L là âm thầm tải xuống bản phát hành HTML mới nhất (sau khi làm theo chuyển hướng)

egrep -o '...' sử dụng regex để tìm tập tin bạn muốn

wget --base=http://github.com/ -i - chuyển đổi đường dẫn tương đối từ đường ống thành URL tuyệt đối

-O scollectorđặt tên tệp mong muốn.

có thể chỉ có thể thêm -Nvào để tải xuống nếu tệp mới hơn nhưng S3 bị lỗi 403 Cấm.


3
Mục tiêu của tôi là tạo một liên kết trên một trang web luôn trỏ đến phiên bản mới nhất. Một lệnh linux sẽ không cho phép điều đó.
Christian Rondeau

1
Đây là những gì tôi đang tìm kiếm nhưng bạn phải chắc chắn rằng bạn có các ký tự thoát chính xác cho ký tự đại diện và dấu chấm khi sử dụng grep.
T. Thomas

@TdotThomas cảm ơn, đó là gợi ý tôi cần cho các số phát hành semver để thoát khỏi các giai đoạn, \.ví dụ như 2.2.0 cần thiết/download/[0-9\.]*/
Jeff Puckett

Không, nó không. Không có char thoát. Nhưng tôi sẽ cho rằng một tùy chọn vlà tiền tố, như một thẻ v0.11.0. Chỉ cần nhập vào 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 của bạn và nó hoạt động hoàn hảo. Cảm ơn, Greg !!
MS Berends

7

Như đã lưu ý trước đây, jq rất hữu ích cho API này và các API REST khác .

tl; dr - chi tiết bên dưới

Giả sử bạn muốn phát hành 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"

Giải pháp cho việc phát hành nguyên tử

Lưu ý mỗi repo có thể có những cách khác nhau để cung cấp vật phẩm mong muốn, vì vậy tôi sẽ chứng minh cho một nguyên tắc hoạt động tốt như nguyên tử .

Lấy tên của các tài sản được công bố

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

Nhận URL tải xuống cho tài sản mong muốn

Dưới nguyên tử-mac là tài sản mong muốn của tôi thông qua 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

Tải về cổ vật

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

sân chơi jq

cú pháp jq có thể khó khăn. Đây là một sân chơi để thử nghiệm những điều jqtrên: https://jqplay.org/s/h6_LfoEHLZ

Bảo vệ

Bạn nên thực hiện các biện pháp để đảm bảo tính hợp lệ của cổ vật được tải xuống thông qua sha256sum và gpg , nếu có thể.


7

Một giải pháp sử dụng wget (bên trong) để lấy nội dung HTML, lọc nó cho tệp zip (với egrep) và sau đó tải xuống tệp zip (với wget bên ngoài).

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

6

Chỉ cần sử dụng một trong các url bên dưới để tải xuống bản phát hành mới nhất: (lấy các url từ dự án đóng hộp chẳng hạn): https://api.github.com/repose/boxbilling/boxbilling/release

Tải xuống bản phát hành mới nhất dưới dạng zip: https://api.github.com/repose/boxbilling/boxbilling/zipball

Tải xuống bản phát hành mới nhất dưới dạng tarball: https://api.github.com/repose/boxbilling/boxbilling/tarball

Nhấp vào một trong các url để tải xuống bản phát hành mới nhất ngay lập tức. Như tôi đã viết những dòng này hiện tại: boxbilling-boxbilling-4.20-30-g452ad1c [.zip / .tar.gz]

CẬP NHẬT: Tìm thấy một url khác trong logfiles của tôi (ví dụ: ví dụ ở trên) https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master


4
đó là những bản repos không được phát hành
Wobble 11/2/2017

5

Không thể theo hỗ trợ của GitHub kể từ 2018-05-23

Đã liên hệ với support@github.com vào 2018-05-23 với tin nhắn:

Bạn có thể xác nhận rằng hiện tại không có cách nào khác ngoài việc gây rối với API không?

và họ trả lời:

Cảm ơn đã tiếp cận. Chúng tôi khuyên bạn nên sử dụng API để tìm nạp bản phát hành mới nhất vì cách tiếp cận đó ổn định, được ghi lại và không có thể thay đổi bất kỳ lúc nào:

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

Tôi cũng sẽ tiếp tục theo dõi điều này tại: https://github.com/isaacs/github/issues/658

Giải pháp Python không có bất kỳ sự phụ thuộc nào

Mạnh mẽ và di động:

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

Xem thêm:

Cũng xem xét trước khi phát hành

/latestkhông thấy bản phát hành trước, nhưng rất dễ thực hiện vì /releaseshiển thị bản mới nhất trước:

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

Các Liên kết với các phiên bản trang trợ giúp không đề cập đến một "mới nhất phát hành" nút, nhưng điều đó không giúp bạn có được một liên kết tải về.

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

Vì vậy, trước tiên bạn cần lấy thẻ mới nhất (như được đề cập trong " URL GitHub để phát hành tệp tải xuống mới nhất ? "):

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
Điều này vẫn đòi hỏi phải đẩy một phiên bản mới của gh-pageschi nhánh mỗi khi bản phát hành mới được thực hiện; Mục tiêu là có một liên kết tĩnh mà tôi có thể sử dụng để chỉ "tham khảo phiên bản mới nhất". Ngay bây giờ lựa chọn tốt nhất của tôi là chỉ tham khảo trang phát hành.
Christian Rondeau

@ChristianRondeau Tôi đồng ý. Tôi không thấy bất cứ nơi nào trong API một cách để tham khảo trực tiếp toàn bộ kho lưu trữ phát hành "mới nhất".
VonC

Tuy nhiên, cảm ơn vì tiền boa; nếu không có câu trả lời nào tốt hơn, có lẽ tôi sẽ thực hiện một tập lệnh để cập nhật các trang gh sử dụng tập lệnh của bạn.
Christian Rondeau

2

trong PHP - chuyển hướng đến bản tải xuống phát hành mới nhất. Chỉ cần đặt trên không gian web của bạn

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

Nếu bạn muốn sử dụng, curlbạn có thể thử -w '%{url_effective}'in URL đó sau chuỗi chuyển hướng (tiếp theo là curl nếu bạn gọi nó bằng -L). Ví dụ

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

đầu ra https://github.com/github-tools/github/releases/tag/v3.1.0.


2

Github hiện hỗ trợ các liên kết tĩnh để tải xuống các tệp riêng lẻ từ bản phát hành mới nhất: https://help.github.com/en/articles/linking-to-release

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

Câu trả lời tương tự đã được đăng 6 tháng trước: stackoverflow.com/questions/24987542/ trên
wvducky

Cảm ơn vì đã chú ý đến điều này @wvducky, tôi đã loại bỏ nó vì nó nghe có vẻ như là một triển khai tùy chỉnh từ nhà phát triển, không phải ai đó từ StackOverflow!
Christian Rondeau

2

Giống như hầu hết truy cập câu hỏi này, tôi hoàn toàn thất vọng với việc tìm cách tự động hóa hoàn toàn việc tải xuống phiên bản LATEST hoặc phiên bản repo trong Github. Lợi ích của giải pháp này là bạn không phải chỉ định bất kỳ bản phát hành hoặc số thẻ nào - nó sẽ chỉ lấy LATEST .

Tôi đã tiến hành thử nghiệm bằng cách sử dụng & repo người dùng Github sau đây:

" F1linux " = Người dùng Github
" pi-ap " = Repo

Tên thư mục tùy ý mà repo được lưu vào được đặt trong:

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

THẲNG THẮN:

Sử dụng Firefox " Web Developer tools" (3 quầy bar ở góc trên bên phải), trong " Mạng " phần tôi thấy https://api.github.comđược chuyển hướng đến https://codeload.github.com, vì vậy bằng đường ống curlđể tartôi có thể lấy mới nhất repo phiên bản và lưu nó vào một tên dự đoán được nên nó có thể được vận hành trên:

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

GIÁN TIẾP:

Sau khi tôi đạt được các bản tải xuống hoàn toàn tự động của bản phát hành phiên bản mới nhất bằng URL TRỰC TIẾP , tôi chuyển sự chú ý của mình để đạt được điều tương tự với chuyển hướng của Github:

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

Phương pháp ưa thích:

Tuy nhiên, xin lưu ý theo nhận xét của Von bên dưới rằng INDIRECTphương pháp ưa thích

Xác nhận thêm:

Để đảm bảo kết quả của tôi có thể được lặp lại với các repos Github được phiên bản khác, các thử nghiệm tương tự đã được thực hiện thành công cho Digital Ocean doctl bộ công cụ api (thực sự đã bắt đầu toàn bộ bài tập!):

Cả TRỰC TIẾPINDIRECT đều hoạt động bằng cách sử dụng cùng một hình thức như trên, chỉ cần thay đổi tên người dùng & repo:

THẲNG THẮN:

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

GIÁN TIẾP:

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

Hấp dẫn. Nâng cao. Tôi không biết về codeload, mặc dù sử dụng API vẫn được khuyến nghị: stackoverflow.com/a/60198721/6309
VonC

Tôi đã gặp phải đau buồn với việc chuyển hướng ban đầu và như đã lưu ý trong câu trả lời Các công cụ "Nhà phát triển web" của Firefox đã đưa tôi đi đúng hướng. Không thể dừng lại ở đó, phải làm cho nó hoạt động với chuyển hướng. Cảm ơn các upvote- nghĩa vụ nhất!
F1Linux

1
@VonC Chỉ cần thêm phản hồi của bạn vào câu trả lời. Tôi hoàn toàn không biết về điều này. Cảm ơn đã chỉ ra điều đó!
F1Linux

1

Tôi muốn tải về các bản phát hành từ README.mdtệp trong mô tả kho lưu trữ. Ở đó, tôi không thể thực thi JavaScript.

Tôi có thể thêm các liên kết như thế này vào tệp README hoặc các trang github cho tất cả các kho lưu trữ của mình:

  • https://niccokunzmann.github.io/download_latest/<USER>/<REPOSITORY>/<FILE>
    Tải tập tin phát hành mới nhất từ ​​kho lưu trữ.
  • https://niccokunzmann.github.io/download_latest/<FILE>
    Điều này hoạt động vì tham chiếu JavaScript được đặt và kho lưu trữ để tải xuống được xác định thông qua document.referrer. Do đó, liên kết cũng sẽ làm việc cho dĩa.

Bạn có thể tìm thấy mã nguồn ở đây , ngã ba hoặc chỉ sử dụng repo của tôi.


1
Đó là một ý tưởng khá thông minh :) nó sẽ không hoạt động khi chia sẻ liên kết hoặc sử dụng curl hoặc lượt thích, nhưng ý tưởng này có thể được thực hiện trong các trang github của dự án.
Christian Rondeau

1
Có thể đây là một trang web JavaScript, người ta cũng có thể viết một dịch vụ chuyển hướng. download-service.com/organization/reposeective/artifact
Người dùng

0

Trong trường hợp repo chỉ sử dụng thẻ thay vì phát hành - cf jQuery - các giải pháp dựa trên một URL không hoạt động.

Thay vào đó, bạn phải truy vấn tất cả các thẻ, sắp xếp chúng và xây dựng URL tải xuống. Tôi đã triển khai một giải pháp như vậy cho ngôn ngữ Go và jQuery repo: Link to Github .

Có lẽ, điều này giúp một ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.