リポジトリの最新リリースでファイルをダウンロードするためのGitHubへのリンクはありますか?


137

GitHubのリリース機能を使用すると、公開されたソフトウェアの特定のバージョンをダウンロードするためのリンクを提供できます。ただし、リリースが行われるたびに、ghページも更新する必要があります。

ソフトウェアの最新バージョンが何であれ、特定のファイルへのリンクを取得する方法はありますか?

たとえば、これは静的リンクになります。

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

回答:


37

数年遅れましたが、サポートするための単純なリダイレクトを実装しましたhttps://github.com/USER/PROJECT/releases/latest/download/package.zip。最新のタグ付きpackage.zipリリースアセットにリダイレクトされます。お役に立てれば幸いです。


1
上の文書化help.github.com/en/articles/linking-to-releasesあなたがに/所有者/名前/リリース/最新/ダウンロード/資産リンクすることができ、あなたの最新のリリース、資産のダウンロードに直接リンクしたい場合-name.zip
リアム

4
ただし、この機能がバージョン管理されたアセット名で機能する場合に役立ちます。
Liam

3
順序が切り替えられることに注意してください.../releases/latest/download/....../releases/download/v0.0.0/...。あなたは、単に置き換えることはできませんv0.0.0latest場所に。
wisbucky

2
@Joshua Peekこれを拡張して、アセット名の「LATEST」をバージョン文字列に拡張できますか?これは、名前にバージョン番号が含まれているアセットに役立ちます。
jwatt

最新のソースコードをダウンロードするのはどうですか?その場合の資産の名前は何ですか?
skd

59

最新リリースのアセットダウンロードリンクを取得するLinuxソリューション(リリースにアセットが1つしかない場合にのみ機能します)

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

7
パイプラインに追加された1つのgrepは、ディストリビューションとアーキテクチャ用のファイルを見つけます。64ビットUbuntuのcurl -s https://api.github.com/repos/atom/atom/releases | grep browser_download_url | grep '64[.]deb' | head -n 1 | cut -d '"' -f 4
Atom

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
マイケル

4
browser_download_urlの@maikel greppingは引き続き機能します。
レオラム

@léo-lamその通りです。アセットがない場合でも、tarball_urlを使用してソースコードを取得できます。
マイケル

api.github.com/repos/boxbilling/boxbilling/releases/latestを回避するために、最新のリリースのみをロードできます | head -n 1
ya.teck

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など)これにより、ブラウザがajax(またはjavascript)をサポートしていない場合や、速度が遅すぎる場合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、2015年

リリースがないからです。チェック:api.github.com/repos/DataTables/DataTables/releases
Jaex

ファンキー... github.com/DataTables/DataTables/releases一連のリリースを示しています。そこにはいくらかの曖昧さがあるに違いありません。
Volte

いいえ、これらはタグにすぎません。リリースはありません。
MrD

2
github.com/jquery/jquery/releasesリリースはありません。単なるバージョンタグです。
Jaex

15

curlおよびを使用してコマンドラインから、最新リリースの最初のファイルを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 Cherniavsky-Paskin

Beniに感謝し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 ます。最新のdocker-composeを取得するためにこれを拡張しました。Endswithは魔法でした。アーチを使用することで、通常は存在するwhat.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
私の目標は、常に最新バージョンを指すWebサイトにリンクを作成することです。Linuxコマンドはそれを許可しません。
クリスチャンロンドー2015年

1
これは私が探していたものですが、grepを使用する場合は、ワイルドカードとドットのエスケープ文字が正しいことを確認する必要があります。
T.トーマス

@TdotThomasおかげで、これは、semverのリリース番号が期間を回避するために必要なヒントです。\.たとえば、2.2.0が必要/download/[0-9\.]*/
Jeff Puckett

いいえ、ありません。エスケープ文字なし。しかし、私vタグのようにオプションをプレフィックスとして想定しますv0.11.0curl -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 2017

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"

アトムリリースのソリューション

各リポジトリには、目的のアーティファクトを提供するさまざまな方法があることに注意してください。そのため、アトムのような正常に動作するものについて説明します

公開されたアセットの名前を取得する

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を取得します

アトム-マックの下は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コンテンツを取得し、(egrepを使用して)zipファイルをフィルタリングしてから、(外部wgetを使用して)zipファイルをダウンロードするソリューション。

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

6

以下のいずれかのURLを使用して、最新のリリースをダウンロードしてください(たとえば、boxbillingプロジェクトからURLを取得します): https

最新リリースを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
これらはリリースではなくリポジトリです
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

依存関係のないPythonソリューション

堅牢でポータブル:

#!/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は、新しいリリースが作成されるたびにブランチの新しいバージョンをプッシュする必要があります。目的は、「最新バージョンを参照する」ために使用できる静的リンクを用意することです。現在、私の最善のオプションは、リリースページを参照することです。
クリスチャンロンドー14

@ChristianRondeau同意する。APIのどこにも、「最新」のリリースアーカイブの完全なURLを直接参照する方法はありませんでした。
VonC 2014

それでも、ヒントをありがとう。より適切な回答が提供されない場合、スクリプトを使用してgh-pagesを更新するスクリプトを実行することになるでしょう。
クリスチャンロンドー2014

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の誰かではなく、開発者のカスタム実装のように聞こえたので、私はそれを却下しました!
クリスチャンロンドー

2

この質問を頻繁に訪問するように、最新バージョンのリリースまたはGithubのリポジトリのダウンロードを完全に自動化する方法を見つけることに私は絶対に苛立ちました。このソリューションの利点は、リリース番号やタグ番号を指定する必要がないことです。最新のものを取得するだけです。

次のGithubユーザーとリポジトリを使用してテストを実施しました。

" f1linux " = Githubユーザー
" pi-ap " = リポジトリ

レポの保存先の任意のディレクトリ名は、次の場所に設定されています。

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

直接:

Firefoxの「使用するWeb開発者、」ツール(右上の3つのバー)「のネットワーク私が見つけた」のセクションhttps://api.github.comにリダイレクトされたhttps://codeload.github.comので、配管でcurltarI最新のバージョン管理リポジトリを取得し、その予測可能な名前にそれを保存することができましたそれを操作することができます:

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ツールキット(これが実際に全体のエクササイズを開始したものです)。

DIRECTINDIRECTはどちらも上記と同じ形式で機能し、ユーザー名とリポジトリを変更するだけです。

直接:

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の「Web開発者」ツールは私を正しい軌道に乗らせました。でもそこで止まらなかったので、リダイレクトで動作させる必要がありました。賛成票をお寄せいただきありがとうございます。
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>
    これが機能するのは、JavaScriptリファラーが設定され、ダウンロードするリポジトリがを介して決定されるためdocument.referrerです。したがって、リンクはフォークに対しても機能します。

ここでソースコードを見つけるか、フォークするか、または私のリポジトリを使用してください。


1
これはかなり賢いアイデアです:)リンクを共有したり、curlなどを使用したりすると機能しませんが、このアイデアはプロジェクトのgithubページで実行できます。
クリスチャンロンドー2017

1
これはJavaScript Webサイトとして可能であるため、リダイレクトを行うサービスを作成することもできます。download-service.com/organization/repository/artifact
ユーザー

0

リポジトリがリリースではなくタグのみを使用している場合-cf. jQuery-1つのURLに基​​づくソリューションは機能しません。

代わりに、すべてのタグをクエリし、並べ替えて、ダウンロードURLを作成する必要があります。私は言語GoとjQueryリポジトリにそのようなソリューションを実装しました:Githubへのリンク

おそらく、これは誰かを助けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.