Project Icon

lastversion

命令行工具快速获取项目最新稳定版本

lastversion是一款命令行工具,可从GitHub、GitLab、PyPI等多个平台获取项目的最新稳定版本信息。它支持自动下载安装、版本比较和资源过滤,适用于自动化构建和部署流程。该工具能智能处理不规范的版本标记,提供准确版本信息,简化软件版本管理工作。

lastversion

Python 包 PyPI 版本 GitHub 发布 文档状态 Codacy 徽章 Codacy 徽章 给我买杯咖啡

在终端中使用 lastversion

English | 简体中文

一个小型命令行工具,帮助回答一个简单的问题:

一个项目的最新稳定版本是什么?

...并可选择下载/安装它。

lastversion 允许从以下支持的位置查找格式良好的最新发布版本:

  • GitHub
  • GitLab
  • BitBucket
  • PyPI
  • Mercurial
  • SourceForge
  • Wikipedia
  • WordPress 插件目录
  • 通过 RSS/ATOM 订阅发布版本的任意软件网站

为什么你需要 lastversion

总的来说,许多项目作者在查找最新版本时会遇到以下复杂情况:

  • 创建一个明显是发布候选版(标签中包含 rc)的正式发布,但忘记将其标记为预发布

  • 在发布标签中放入无关文本,例如 release-1.2.3name-1.2.3-2019 等花哨的内容

  • 在发布标签中添加或不添加 v 前缀。今天有,明天没有。我自己在这方面也不一致 :)

  • 从一种版本格式切换到另一种,例如从 v20150121v2.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资源,并且你的系统有yumdnf,你可以直接安装项目的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选项。

可接受的值有majorminorpatch

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_TOKENGITHUB_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)之间可能有所不同,但保证始终包含以下键:

  • versionVersion对象,包含找到的发布版本,如1.2.3
  • source:字符串,项目来源的标识符,如githubgitlab
  • tag_date:datetime对象,发布日期,如2020-12-15 14:41:39
  • from:字符串,包含项目的完整URL
  • tag_name:字符串,对应发布的版本控制标签名

lastversion.latest函数接受3个参数

  • repo,格式为<owner>/<name>,或该仓库下的任何URL,如https://github.com/dvershinin/lastversion/issues
  • format,接受与交互运行lastversion时相同的值,以及dict以返回上述描述的字典
  • pre_ok,布尔值,表示是否将预发布版本包括在潜在版本中
  • at,使用单词仓库名时指定项目位置,可选值为githubgitlabbitbucketpiphgsfwebsite-feedlocal

在持续集成中使用

你也可以直接在GitHub action工作流中使用lastversion,通过lastversion-action

功能请求和增强

只有对GitHub发布至关重要的功能才会被优先考虑。如果你的问题或建议的功能超出当前重点,以下是你可以帮助实现它的方法:

  • 贡献:我们鼓励你提交一个包含你提议更改或增强的拉取请求。
  • 捐赠:如果你想看到某个功能被开发但无法贡献代码,可以考虑进行捐赠。你的捐赠可以帮助我们分配资源来开发额外的功能和改进。

赞助信息

GetPageSpeed RPM仓库:通过我们的NGINX模块和性能工具提升你的服务器性能。访问GetPageSpeed.com了解更多并订阅以获取访问权限。

DeepSource

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号