如何使用JFrog CLI按版本号对Artifactory软件包搜索结果进行排序?

时间:2019-05-07 14:31:57

标签: 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.101
1.2.3.103
1.2.3.95
1.2.3.99
1.2.3.99-beta10
1.2.3.99-beta9

我的目标是获得输出按版本排序

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,因为它可能与版本排序不同。即使我不使用--sort-by选项,它也不起作用。版本号也可以包含“ -beta”之类的字母。

在Artifactory TreeView中,它是正确的,但在CLI中是不正确的。

如何获得按版本号排序的结果?

1 个答案:

答案 0 :(得分:1)

您可以使用jq对版本号字符串进行排序。

如果字符串是“原始”字符串,每行一个,则可以使用以下jq程序:

def parse:
 sub("alpha"; "alpha.")
 | sub("beta"; "beta.") 
 | sub("gamma"; "gamma.")
 | [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程序的主要部分可能看起来像这样:

map(.props["nuget.version"]) | sort_by(parse)[]

(当然,仅当使用inputs进行读取时才需要-n选项。)