lastversion
English | 简体中文
一个小型命令行工具,帮助回答一个简单的问题:
一个项目的最新稳定版本是什么?
...并可选择下载/安装它。
lastversion
允许从以下支持的位置查找格式良好的最新发布版本:
- GitHub
- GitLab
- BitBucket
- PyPI
- Mercurial
- SourceForge
- Wikipedia
- WordPress 插件目录
- 通过 RSS/ATOM 订阅发布版本的任意软件网站
为什么你需要 lastversion
总的来说,许多项目作者在查找最新版本时会遇到以下复杂情况:
-
创建一个明显是发布候选版(标签中包含
rc
)的正式发布,但忘记将其标记为预发布 -
在发布标签中放入无关文本,例如
release-1.2.3
或name-1.2.3-2019
等花哨的内容 -
在发布标签中添加或不添加
v
前缀。今天有,明天没有。我自己在这方面也不一致 :) -
从一种版本格式切换到另一种,例如从
v20150121
到v2.0.1
人类的行为并不总是一致的。
为了处理所有这些混乱,并在命令行上简单地获取格式良好的最新稳定版本(或下载 URL!),你可以使用 lastversion
。
它的主要用途是用于构建系统 - 当你想要自动监视特定项目的发布版本以自动构建包时。 或者在自动化脚本中需要获取最新版本时。
lastversion
使用一点人工智能来检测发布者是否错误地将测试版标记为稳定版。
它包含了清理版本信息中人为不一致性的逻辑。
概要
lastversion apache/incubator-pagespeed-ngx
#> 1.13.35.2
lastversion download apache/incubator-pagespeed-ngx
#> 已下载 incubator-pagespeed-ngx-v1.13.35.2-stable.tar.gz
lastversion download apache/incubator-pagespeed-ngx -o pagespeed.tar.gz
#> 使用选定的文件名下载
lastversion https://transmissionbt.com/
#> 3.0
lastversion format "mysqld Ver 5.6.51-91.0 for Linux"
#> 5.6.51
基于 RPM 系统的安装
支持:
- CentOS/RHEL 7、8、9,包括 AlmaLinux 和 Rocky Linux 等克隆版本
- Amazon Linux 2
- Fedora Linux
sudo yum -y install https://extras.getpagespeed.com/release-latest.rpm
sudo yum -y install lastversion
其他系统的安装
使用 pip
安装最简单:
pip install lastversion
使用方法
通常,你只需将仓库 URL(或仓库所有者/名称)作为唯一参数传递给它,例如:
lastversion https://github.com/gperftools/gperftools
等效的调用方式(输出相同)是:
lastversion gperftools/gperftools
如果你懒得复制粘贴项目的 URL,你可以直接输入其名称作为参数,这将使用仓库搜索 API(速度较慢)。 帮助回答 Linux 的最新版本是什么:
lastversion linux
或者想知道 WordPress 的最新版本是什么?
lastversion wordpress
主参数的特殊值 self
将查找 lastversion
自身的最新发布版本。
有关控制输出或行为的更多选项,请查看 --help
输出:
用法: lastversion [-h] [--pre] [--sem {major,minor,patch,any}] [-v]
[-d [文件名]] [--format {version,assets,source,json,tag}]
[--assets] [--source] [-gt 版本] [-b 主版本] [--only 正则表达式]
[--exclude 正则表达式] [--filter 正则表达式] [--having-asset [资源]]
[-su] [--even]
[--at {github,gitlab,bitbucket,pip,hg,sf,website-feed,local,helm_chart,wiki,system,wp,gitea}]
[-y] [--version]
[{get,download,extract,unzip,test,format,install,update-spec}]
<仓库 URL 或字符串>
查找最新的软件发布版本。
位置参数:
{get,download,extract,unzip,test,format,install,update-spec}
要运行的操作。默认:get
<仓库 URL 或字符串> 格式为 owner/name 的仓库,或属于该仓库的任何 URL,或版本字符串
可选参数:
-h, --help 显示此帮助信息并退出
--pre 在潜在版本中包含预发布版本
--sem {major,minor,patch,any}
用于打印或比较的语义版本级别基准
-v, --verbose 显示底层执行的操作,-vv 增加详细程度级别
-d [文件名], -o [文件名], --download [文件名], --output [文件名]
使用自定义文件名下载
--format {version,assets,source,json,tag}
输出格式
--assets 返回最新发布版本的资源下载 URL
--source 仅返回最新发布版本的源代码 URL
-gt 版本, --newer-than 版本
仅当最新版本比给定版本更新时输出
-b 主版本, --major 主版本, --branch 主版本
仅考虑特定主版本的发布,例如 2.1.x
--only 正则表达式 仅考虑包含此文本的发布。对于包含多个项目的仓库很有用
--exclude 正则表达式 仅考虑不包含此文本的发布。对于包含多个项目的仓库很有用
--even 仅将偶数版本如 1.[2].x 或 3.[6].x 视为稳定版本
--filter 正则表达式 使用正则表达式过滤 --assets 结果
--having-asset [资源] 仅考虑包含此资源的发布
-su, --shorter-urls 生成稍短的 URL
--at {github,gitlab,bitbucket,pip,hg,sf,website-feed,local,helm_chart,wiki,system,wp,gitea}
如果仓库参数是一个词,指定在哪里查找项目。默认通过内部查找或 GitHub 搜索
-y, --assumeyes 自动对所有问题回答 yes
--version 显示程序的版本号并退出
--format
将影响显示最新发布版本的信息类型和格式,例如:
-
version
是默认值。简单输出最新发布版本的格式良好的版本号 -
assets
将输出换行分隔的资源 URL 列表(如果有),否则链接到源代码存档 -
source
将输出源代码存档链接,无论发布版本是否添加了一些资源 -
json
可被外部 Python 模块使用或用于调试,是满足最新版本检查的 API 调用的字典/JSON 输出 -
tag
将仅输出最新发布版本的标签名称,这在您自己构造下载 URL 或需要标签名称时很有用
资源是一个可下载的文件,通常代表可执行文件或"即可启动"的项目。它是您在正式发布下看到的文件,通常是针对特定平台编译的程序。
源文件是发布版本源代码的 tar 压缩包或 zip 压缩包。
您可以通过传递相应的 --format
标志来显示最新发布版本的资源或源 URL,例如 --format source
您也可以简单地传递 --source
而不是 --format source
,以及 --assets
而不是 --format assets
,如:
lastversion --assets mautic/mautic
#> https://github.com/mautic/mautic/archive/2.15.1/mautic-2.15.1.tar.gz
默认情况下,lastversion
会过滤 --assets
的输出以适应特定操作系统。在 Linux 上谁需要 .exe
呢?
要覆盖此行为,您可以使用 --filter
,它的参数是一个正则表达式。要禁用操作系统过滤,使用 --filter .
,这将匹配所有内容。
您自然可以在使用 grep
的地方使用 --filter
,例如 lastversion --assets --filter win 仓库
用例: 处理多项目仓库
有时单个仓库实际上托管了许多组件,并创建了对每个组件都有单独版本线的发布版本。
为帮助 lastversion
获取此类仓库的组件版本,使用 --only
和 --exclude
开关。
它们使 lastversion
只查看那些带有(或不带有)指定字符串标记的发布版本。
示例:
lastversion --only chart https://github.com/lastversion-test-repos/autoscaler
上面将报告 9.16.0
。
lastversion --exclude chart https://github.com/lastversion-test-repos/autoscaler
上面将报告非图表的最新版本,1.23.0
。
对于复杂情况,您可以为两个参数传入正则表达式,方法是在它们前面加上波浪号,如下所示:
lastversion --only '~-po.-' https://github.com/lastversion-test-repos/autoscaler
上面将仅考虑标记为 -pod-、-pov- 等的发布版本。
用例: 如何下载某个软件的最新版本
您还可以使用 lastversion
下载最新发布版本的资源/源代码。
下载最新的 Mautic 源代码发布版本:
lastversion download mautic/mautic
自定义下载的文件名(仅适用于源代码,这是默认设置):
lastversion download mautic/mautic -o mautic.tar.gz
你也可以使用extract
命令直接获取并解压最新版本的文件到当前工作目录:
lastversion extract wordpress
你可以让lastversion
输出源码/资源URL,并用其他工具下载:
wget $(lastversion --assets mautic/mautic)
这将下载最新稳定版Mautic的所有资源,包括两个zip文件。
工作原理:lastversion
输出所有资源URL,每个一行,而wget
聪明地下载每个URL。很神奇 :)
对于没有添加资源的发布版本,它将下载源代码压缩包。
要始终下载源代码,请改用--source
:
wget $(lastversion --source mautic/mautic)
用例:使用指定文件名下载特定资源
如果你想下载最新版本发布的特定资源,并以所需名称保存下载的文件,可以结合使用-d
选项(用于下载名称)和--filter
来指定资源过滤器。
例如:
lastversion --pre Aircoookie/WLED --format assets --filter ESP32.bin -d ESP32.bin
用例:获取最新版本(包括测试版)
我们认为最新发布版是稳定的/未标记为测试版的。如果你认为不是这样,那么传递--pre
开关,如果仓库的最新版本是预发布版,你将获得其版本号:
lastversion --pre mautic/mautic
#> 2.15.2b0
用例:获取特定分支的版本
对于某些项目,可能同时有多个稳定版本在不同分支上可用。一个明显的例子是PHP。你可以使用--major
标志来指定要匹配的主要版本号,以帮助你找到某个分支的最新稳定版本,像这样:
lastversion php/php-src --major 7.2
这将给你当前PHP 7.2.x的稳定版本,例如7.2.28
。
分支选择器很容易在分号后指定,结合搜索API,相同的简洁调用方式为:
lastversion php:7.2
分支选择器也可以用于获取特定版本的详细信息,例如:
lastversion php:7.2.33 --assets
用例:具有特定资源的发布版本
有时项目会正式发布,但上传资源的时间会延迟。而你可能总是对特定类型的资源感兴趣。
那么你可以让lastversion
只将具有特定资源名称的最新发布版本视为最新版本。
使用--having-asset
开关很容易实现:
lastversion telegramdesktop/tdesktop --having-asset "Linux 64 bit: Binary"
--having-asset
的参数值可以是正则表达式。为此,在前面加上波浪线。例如,要获取带有macOS安装程序的发布版本:
lastversion telegramdesktop/tdesktop --having-asset "~\.dmg$"
你也可以完全不给--having-asset
传递值。这样lastversion
只会返回添加了任何资源的最新发布版本:
lastversion telegramdesktop/tdesktop --having-asset
用例:获取操作系统版本
操作系统通常不是通过GitHub发布或类似方式进行版本控制的。 要获取操作系统的最新稳定版本,除了从其网站或其他公告渠道获取,这是一个挑战。
lastversion
对此采取的一个简单折衷方法是硬编码知名操作系统名称,并在后台使用维基百科:
lastversion rocky #> 8.4
lastversion windows #> 10.0.19043.1081
lastversion ios #> 14.6
你可以提供一个完整的维基百科页面URL,用于获取操作系统/软件项目的版本信息,例如:
lastversion https://en.wikipedia.org/wiki/Rocky_Linux #> 8.4
特殊用例:NGINX稳定版与主线分支版本
lastversion https://nginx.org --major stable #> 1.16.1
lastversion https://nginx.org --major mainline #> 1.17.9
在后台,这会检查hg.nginx.org
,这是一个Mercurial网络仓库。
这些仓库也是支持的,例如:
lastversion https://hg.example.com/project/
Mercurial仓库现在相对较少见,但主要是为NGINX添加了支持。
特殊用例:查找PyPI项目的发布版本
大多数Python库/应用托管在PyPI上。要检查PyPI上项目的版本,你可以使用:
lastversion https://pypi.org/project/requests/
如果你更喜欢使用较短的仓库名称,请确保使用--at pip
开关,像这样:
lastversion requests --at pip
安装RPM资源
如果一个项目提供.rpm
资源,并且你的系统有yum
或dnf
,你可以直接安装项目的RPM,像这样:
sudo lastversion install mailspring
这会找到MailSpring,获取其最新发布信息,过滤.rpm
资源并将其传递给yum
/ dnf
。
你甚至可以设置一个自动更新的cron任务,确保你使用的是最新版本的软件包,像这样:
@daily /usr/bin/lastversion install mailspring -y 2>/dev/null
如果Mailspring GitHub仓库发布了带有新.rpm
的版本,它将自动安装,确保你运行的是最新最好的Mailspring版本。
你甚至会在更新后收到电子邮件提醒(标准cron功能)。
不用说,这种RPM包通常不了解所有可能缺失的依赖项。因此,只有在基本yum
仓库中缺少软件时,才使用lastversion install ...
。
安装AppImage
如果项目提供了.AppImage
,你可以直接使用lastversion
安装它们。
AppImage
是一个自包含的Linux可执行文件。lastversion
为你做的是获取
最新发布的AppImage
,将其安装在~/Applications/<app>
下并使其可执行。
只需运行:
lastversion install fluent-reader
测试版本解析器
test
命令可用于故障排除或简单地格式化带版本的字符串:
lastversion test 'blah-1.2.3-devel' # > 1.2.3.dev0
lastversion test '1.2.x' # > False (没有明确的版本)
lastversion test '1.2.3-rc1' # > 1.2.3rc1
在bash
中使用lastversion
脚本
语义化版本支持
有时你只想检查特定语义化版本级别的更新。
一个项目是否有新的次要版本?一个项目是否有新的主要版本?
要只打印必要的语义化版本基础,使用--sem
选项。
可接受的值有major
、minor
和patch
。
lastversion wordpress --sem major
#> 5
lastversion wordpress --sem minor
#> 5.9
lastversion wordpress --sem patch
#> 5.9.3
--sem patch
值可用于将给定结果规范化为语义化版本,
如果一个项目不严格遵循语义化规则。例如,有时WordPress会发布一个x.y
版本,而它隐含的是x.y.0。所以假设WordPress发布了"5.10":
lastversion wordpress --sem patch
#> 5.10.0
格式化任意版本字符串
假设你运行了mysqld --version
并得到这个输出:
mysqld Ver 5.6.51-91.0 for Linux on x86_64 (Percona Server (GPL), Release 91.0, Revision b59139e)
如果你只想提取MySQL服务器的主要版本,这在bash中很难解析。
lastversion
可以轻松解析并根据所需的语义化版本级别提供所需信息:
lastversion --sem major format "mysqld Ver 5.6.51-91.0 for Linux on x86_64 (Percona Server (GPL) , Release 91.0, Revision b59139e)"
#> 5
比较任意版本
在命令行上使用lastversion
可以轻松比较版本。
比较两个版本,命令将输出最高版本:
lastversion 1.2.3 -gt 1.2.4
#> 1.2.4
查看下面的退出代码,以确定第一个参数是否是更高版本,或者第二个是否更高。
前面描述的--sem
选项将影响打印的内容和比较的语义化版本基础级别,从而影响结果。
检查新发布
当你在构建某个上游包,并且之前已经做过,有一个已知的"上次构建"版本时。 自动构建变得很简单:
CURRENTLY_BUILT_VER=1.2.3 # 存储在某处,例如在我的情况下是spec文件
LAST_VER=$(lastversion repo/owner -gt ${CURRENTLY_BUILT_VER})
if [[ $? -eq 0 ]]; then
# LAST_VER 更新,更新并触发构建
# ....
fi
这里,-gt
实际上是传递给lastversion
的一个开关,其作用类似于
bash中的-gt
比较。
如果你想让这个可靠,还有更多内容。
查看我关于
使用lastversion
进行RPM自动构建的讨论
检查你的Linux机器是否有更新的内核
LATEST_KERNEL=$(lastversion linux -gt $(uname -r | cut -d '-' -f 1))
if [[ $? -eq 0 ]]; then
echo "我最好现在更新内核,因为有${LATEST_KERNEL}可用"
else
echo "我的内核是最新最好的。"
fi
退出状态代码
退出状态代码是通常用来传达命令执行成功或失败的方式。
因此lastversion
遵循这一点:成功的命令返回0
,而其他任何情况都是某种错误。
例如,当找到最新的稳定版本时,返回0
。
对于-gt
比较,当左侧参数比右侧参数更新时,也返回0
。
退出状态代码1
用于诸如存储库根本没有发布标签,或存储库不存在的情况。
退出状态代码2
用于-gt
版本比较的否定查找,即右侧参数比左侧参数更新时。
退出状态代码3
在过滤最后发布的资产产生空URL集(无匹配)时返回。
提示
获取最新版本对API的负担很重,因为GitHub不允许按时间顺序获取标签,而且一些存储库会从一种版本格式切换到另一种,所以我们不能 仅仅认为最高版本就是最新的。 我们必须获取每个标签的提交日期,并查看它是否实际上更新。因此,对于较大的存储库,速度会更慢, 因为它们可能有很多标签。
因此,lastversion
利用API响应缓存来快速且轻量地使用GitHub API,
它进行条件ETag验证,根据GitHub API,这不会计入速率限制。
缓存存储在Linux系统的~/.cache/lastversion
中。
强烈建议设置你的GitHub API令牌。
基本的API令牌就足够了,你可以取消选择所有权限。
然后你可以通过在~/.bashrc
文件中添加以下内容来增加你的速率限制:
export GITHUB_API_TOKEN=xxxxxxxxxxxxxxx
你可以使用GITHUB_API_TOKEN
或GITHUB_TOKEN
环境变量。
前者优先级更高。
对于GitLab,你可以使用 个人访问令牌:
export GITLAB_PA_TOKEN=xxxxxxxxxxxxxxx
然后运行source ~/.bashrc
。之后,lastversion
将使用它来获得GitHub
更大的API调用限额。
在Python模块中的使用
你可以使用lastversion.has_update(...)
来检查某个现有版本是否有更新,简单示例如下:
from lastversion import has_update
latest_version = has_update(repo="mautic/mautic", current_version='1.2.3')
if latest_version:
print(f'有新版本的Mautic可用:{latest_version}')
else:
print('没有可用的更新')
lastversion.has_update(...)
函数接受任何仓库的URL(或其简短名称,如owner/name
),你需要传入当前版本。
如果你正在检查PyPi上的项目版本,请额外提供at='pip'
参数,以避免传入完整的PyPI项目URI,并消除与GitHub托管项目的歧义。例如,检查Requests库的新版本:
from lastversion import has_update
latest_version = has_update(repo="requests", at='pip', current_version='1.2.3')
if latest_version:
print(f'有新版本的Requests库可用:{latest_version}')
else:
print('没有可用的更新')
has_update
函数返回以下之一:
- Version对象
- 如果没有比给定版本更新的版本,则返回
False
或者,调用lastversion.latest(...)
函数来获取仓库的最新版本信息。
from lastversion import latest
from packaging import version
latest_mautic_version = latest("mautic/mautic", output_format='version', pre_ok=True)
print(f'最新的Mautic版本:{latest_mautic_version}')
if latest_mautic_version >= version.parse('1.8.1'):
print('这是更新的版本')
使用output_format='version'
(默认值),该函数返回一个Version对象,或None
。因此你可以像上面那样进行版本比较、检查开发状态等操作。
使用output_format='dict'
,返回一个包含最新发布信息的字典,或False
。字典的键在不同的项目位置(如GitHub和BitBucket)之间可能有所不同,但保证始终包含以下键:
version
:Version对象,包含找到的发布版本,如1.2.3
source
:字符串,项目来源的标识符,如github
或gitlab
tag_date
:datetime对象,发布日期,如2020-12-15 14:41:39
from
:字符串,包含项目的完整URLtag_name
:字符串,对应发布的版本控制标签名
lastversion.latest
函数接受3个参数
repo
,格式为<owner>/<name>
,或该仓库下的任何URL,如https://github.com/dvershinin/lastversion/issues
format
,接受与交互运行lastversion
时相同的值,以及dict
以返回上述描述的字典pre_ok
,布尔值,表示是否将预发布版本包括在潜在版本中at
,使用单词仓库名时指定项目位置,可选值为github
、gitlab
、bitbucket
、pip
、hg
、sf
、website-feed
、local
在持续集成中使用
你也可以直接在GitHub action工作流中使用lastversion
,通过lastversion-action
。
功能请求和增强
只有对GitHub发布至关重要的功能才会被优先考虑。如果你的问题或建议的功能超出当前重点,以下是你可以帮助实现它的方法:
- 贡献:我们鼓励你提交一个包含你提议更改或增强的拉取请求。
- 捐赠:如果你想看到某个功能被开发但无法贡献代码,可以考虑进行捐赠。你的捐赠可以帮助我们分配资源来开发额外的功能和改进。
赞助信息
GetPageSpeed RPM仓库:通过我们的NGINX模块和性能工具提升你的服务器性能。访问GetPageSpeed.com了解更多并订阅以获取访问权限。