如何从Nexus Raw仓库下载指定SemVer格式制品的最高版本
Nexus Raw仓库获取最高semver版本制品的实现方法
原命令失效的核心原因
search/assets/download接口的sort=version参数默认是升序排序,不指定排序方向的话,接口会返回匹配列表里排在最靠前的低版本资产,并非最高版本。- Raw类型仓库不属于Nexus内置的带版本元数据托管的仓库类型(如Maven、npm),接口内置的版本解析逻辑不会严格遵循三段式semver规则,默认走字符串字典序排序,会出现
1.10.2被排在1.2.3前面的排序错误,就算调整排序方向也没法保证拿到真正的最高版本。
两种可用的实现方案
方案1:修正接口参数的快速实现
如果你的Nexus版本在3.21以上,且所有制品版本号没有跨位数字段(比如所有次版本、修订号都是个位数),可以直接调整请求参数拿到对应版本:
- 追加
direction=desc参数,指定版本降序排列 - 明确通配符匹配规则,避免误匹配无关资产
修正后的wget命令参考:
wget "http://buildserver/service/rest/v1/search/assets/download?repository=foobar&name=com/mycompany/pcba_firmware*.bin&sort=version&direction=desc"
注意:这个方案仅适合版本号结构简单的场景,一旦出现两位数的版本号段,排序就会出现错误,没法保证拿到真正的最高版本。
方案2:结合脚本的精准semver排序实现(推荐)
如果仓库的版本号存在跨位数的场景(比如同时存在1.2.3、1.10.1这类版本),必须通过自主版本解析排序拿到准确的最高版本,步骤如下:
- 调用普通资产搜索接口(不带download参数),拉取所有匹配目标规则的资产列表,请求时追加
pageSize=100参数,避免Nexus默认分页只返回前10条结果,漏检更高版本的资产 - 从每个资产的路径/文件名中筛选出嵌入三段式semver版本号的条目
- 用支持自然版本排序的工具对版本号做排序,选出最大值对应的资产路径
- 拼接最高版本对应的资产完整地址,直接执行下载
参考可直接运行的curl+jq实现示例:
# 筛选出含有效semver的资产路径,按自然版本排序取最高版本对应的路径 TARGET_MAX_VER_PATH=$(curl -s "http://buildserver/service/rest/v1/search/assets?repository=foobar&name=com/mycompany/pcba_firmware*bin&pageSize=100" \ | jq -r '.items[].path' \ | grep -E '[0-9]+\.[0-9]+\.[0-9]+' \ | sort -V \ | tail -n1) # 拼接完整下载地址执行下载 wget "http://buildserver/repository/foobar/${TARGET_MAX_VER_PATH}"
- 这套方法完全绕开Nexus内置的不可靠版本排序逻辑,能严格按照semver规则正确识别版本高低,不会出现字典序排序的错误。
- 只要调整grep的正则规则,就能适配版本号嵌在文件名里、嵌在路径段里的不同目录结构。
内容的提问来源于stack exchange,提问作者jdm
相关产品推荐
相关产品推荐

