Nuget 如何使用JFrog CLI按版本号对Artifactory包搜索结果排序?
我需要在Artifactory中获取特定NuGet包的最新版本。 我使用以下JFrog CLI命令接收所有版本的列表(稍后使用Nuget 如何使用JFrog CLI按版本号对Artifactory包搜索结果排序?,nuget,version,artifactory,jq,jfrog-cli,Nuget,Version,Artifactory,Jq,Jfrog Cli,我需要在Artifactory中获取特定NuGet包的最新版本。 我使用以下JFrog CLI命令接收所有版本的列表(稍后使用--limit=1),包括使用jq进行JSON解析: jfrog rt s myRepo/Path/ --props "nuget.id=MyLib" --sort-by=name --sort-order=desc | jq -M -r ".[] | .props.\"nuget.version\" | .[]" 上面的示例产生如下原始字符串输出: 1.2.3.10
--limit=1
),包括使用jq进行JSON解析:
jfrog rt s myRepo/Path/ --props "nuget.id=MyLib" --sort-by=name --sort-order=desc | jq -M -r ".[] | .props.\"nuget.version\" | .[]"
上面的示例产生如下原始字符串输出:
1.2.3.101
1.2.3.103
1.2.3.95
1.2.3.99
1.2.3.99-beta10
1.2.3.99-beta9
map(.props["nuget.version"]) | sort_by(parse)[]
我的目标是获得按版本排序的输出:
1.2.3.95
1.2.3.99
1.2.3.99-beta9
1.2.3.99-beta10
1.2.3.101
1.2.3.103
不幸的是,我不能使用--sort by=created
,因为它可能不同于版本排序。即使我不使用--排序方式
选项,它也不起作用。版本号也可以包含“-beta”等字母
在artifactorytreeview中是正确的,但在CLI中不是
如何获得按版本号排序的结果?您可以使用jq对版本号字符串进行排序 如果字符串是“原始”字符串,每行一个,那么您可以使用以下jq程序:
def parse:
sub("alpha"; "alpha.")
| sub("beta"; "beta.")
| sub("gamma"; "gamma.")
| sub("prerelease"; "prerelease.")
| sub("debug"); "debug.")
| [splits("[-.]")]
| map(tonumber? // .) ;
[inputs]
| sort_by(parse)[]
这个jq程序可以这样运行:
jq -nrR -f program.jq versions.txt
对于示例版本号,这将产生:
1.2.3.95
1.2.3.99
1.2.3.99-beta9
1.2.3.99-beta10
1.2.3.101
1.2.3.103
在您的情况下,通过按照上面所示的方式修改程序以使用parse
,无需再次调用jq即可获得结果。jq计划的主要部分可能如下所示:
1.2.3.101
1.2.3.103
1.2.3.95
1.2.3.99
1.2.3.99-beta10
1.2.3.99-beta9
map(.props["nuget.version"]) | sort_by(parse)[]
(当然,只有在使用输入读取时才需要-n选项。)
最高版本号
如果(如注释中所示)您只需要最高的版本号,只需将最终的[]
更改为[-1]
:
... | sort_by(parse)[-1]
谢谢你的回复。split(在您的第二个代码段)是否有输入错误?我尝试了几个命令,但始终得到:jq:error(at:150):拆分输入和分隔符必须是字符串
。您的书写程序显示“类似于此”,但可能是。props[“nuget.version”]
并不总是字符串。这就是为什么遵循指导原则通常是个好主意。我更新了我的问题/示例。添加第一个命令片段后,我得到了以下(线性化的)结果:[[“1”、“2”、“3”、“95”]、[“1”、“2”、“3”、“99”]、[“1”、“2”、“3”、“101”]、[“1”、“2”、“3”、“103”]、[“1”、“2”、“3”、“99-beta10”]、[“1”、“2”、“3”、“99-beta9”]
,它们至少对纯数字进行排序,但不使用“-beta”标记。哇,这已经非常有效了!)但奇怪的是,缺少一个输出元素(第一个?)。Artifactory说要找到全部,但输出少了一个。(如何)在没有外部程序的情况下制作一行程序。jq?我试着把它放在引号(')中,同时也转义了双引号(\”)。我的坏-我忘记了-n选项。