使用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最新发布的页面
只需使用下面的网址下载最新版本:
(以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
点击其中一个网址立即下载最新版本。当我写这一行时,它目前是:boxbilling-boxbilling-4.20-30-g452ad1c[.zip/.tar.gz]
更新:在我的日志文件中发现了另一个url(参考上面的例子)
https://codeload.github.com/boxbilling/boxbilling/legacy.tar.gz/master
这可以在一行代码中完成,如下所示:
$ curl -s https://api.github.com/repos/slmingol/gorelease_ex/releases/latest \
| grep -wo "https.*Linux.*gz" | wget -qi -
这里我们:
拉出GitHub的API端,以获得带有最新标签的发布构件的信息。
解析输出,寻找与模式https.*Linux.*gz匹配的工件。
将URL传递给命令wget -qi -,以便下载
为了进一步揭示这里发生了什么,这里有一个更广泛的API端点的grep:
$ curl -s https://api.github.com/repos/slmingol/gorelease_ex/releases/latest | grep -wo "https.*" | grep gz
https://github.com/slmingol/gorelease_ex/releases/download/0.0.78/gorelease_ex_0.0.78_Darwin_x86_64.tar.gz"
https://github.com/slmingol/gorelease_ex/releases/download/0.0.78/gorelease_ex_0.0.78_Linux_x86_64.tar.gz"
上面你可以看到匹配的url。
进一步提示
您还可以参数化grep参数,以便它“动态地”确定它在哪个平台上运行,并根据该平台替换适当的字符串。
$ curl -s https://api.github.com/repos/slmingol/gorelease_ex/releases/latest \
| grep -wo "https.*$(uname).*gz" | wget -qi -
这里$(uname)将返回Darwin、Linux等。
这种解决方案的好处是您不必指定任何版本或标记号—它只会抓取LATEST。
测试:
我使用以下Github用户和repo进行了测试:
“f1linux” = Github用户
“pi-ap” = 存储库
repo保存到的任意目录名称设置为:
--one-top-level="pi-ap"
直接:
使用Firefox的“Web Developer”工具(右上角的3条),在“Network”部分,我发现https://api.github.com重定向到https://codeload.github.com,所以通过管道curl到tar,我能够获取最新版本的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
首选的方法:
然而,请注意,根据冯的评论,间接是首选的方法
进一步验证:
为了确保我的结果可复制到其他版本的Github reppos,我们成功地为Digital Ocean的doctl api工具包执行了相同的测试(这实际上是整个练习的开始!):
DIRECT和INDIRECT都使用与上面相同的表单,只需更改用户名和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