使用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最新发布的页面
这种解决方案的好处是您不必指定任何版本或标记号—它只会抓取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
这种解决方案的好处是您不必指定任何版本或标记号—它只会抓取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
这是针对Linux的。
我看到了上面被接受的答案
A few years late, but I just implemented a simple redirect to support https://github.com/USER/PROJECT/releases/latest/download/package.zip. That should redirected to the latest tagged package.zip release asset. Hope it's handy!
但有评论指出,它不支持版本化文件名。
在搜索了一会儿之后,我编写了一个适用于版本化文件名的一行调用。它使用curl获取最新的文件版本,然后使用添加的重定向支持来下载最新版本的文件。
wget $'https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest/download/<FILE NAME START>-'$(curl -s https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest | grep -o -P '(?<=releases/tag/).*(?=\">)')$'<FILE NAME END>'
So it targets a file that's named like <REPO NAME>-linux64_arm-<VERSION NUMBER>.tar.gz that's on the webpage https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest after it redirects. It does this by looking for the <VERSION NUMBER> between releases/tag/ and the "> in the text that's returned from the curl call. So to be really explicit, <FILE NAME START> is the <REPO NAME>-linux64_arm- and <FILE NAME END> is the .tar.gz in the above example. Get the START and END bits by looking at what the https://github.com/<UMBRELLA PROJECT>/<REPO NAME>/releases/latest uses as its file naming scheme.
我通过模仿其他人如何使用grep和curl来创建这个,现在才学会所有这些,所以如果它做了一些我甚至无法理解的真正淘气的事情,请告诉我!我还说<UMBRELLA PROJECT>,但用户名应该能够去那里就好了。大声喊出https://stackoverflow.com/a/13245961/2403531的grep调用,https://unix.stackexchange.com/a/10264的$字符串$连接。
另一个Linux解决方案使用curl和wget从最新版本页面下载单个二进制文件
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(在执行重定向之后)
鹭-o '…'使用正则表达式找到你想要的文件
wget——base=http://github.com/ -i将管道的相对路径转换为绝对URL
和-O sccollector设置所需的文件名。
如果文件更新,可以添加-N到下载,但S3给出了403禁止错误。