如何使用 JFrog CLI 按版本号对 Artifactory 包搜索结果进行排序?
How to sort Artifactory package search result by version number with 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 中不是。
如何获得按版本号排序的结果?
您可以使用 jq 对版本号字符串进行排序。
如果字符串是 "raw" 个字符串,每行一个,那么你可以使用这个 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
在您的情况下,无需再次调用 jq 即可获得结果,方法是修改您的程序以使用 parse
,如上所示。 jq 程序的主要部分可能如下所示:
map(.props["nuget.version"]) | sort_by(parse)[]
(当然-n选项只有在使用inputs
读取时才需要。)
最高版本号
如果(正如评论中指出的那样)您只想要最高版本号,您可以简单地将最后的 []
更改为 [-1]
:
... | sort_by(parse)[-1]
我需要在 Artifactory 中获取特定 NuGet 包的最新版本。
我使用以下 JFrog CLI 命令接收所有版本的列表(稍后使用 --limit=1
),包括使用 jq:
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 中不是。
如何获得按版本号排序的结果?
您可以使用 jq 对版本号字符串进行排序。
如果字符串是 "raw" 个字符串,每行一个,那么你可以使用这个 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
在您的情况下,无需再次调用 jq 即可获得结果,方法是修改您的程序以使用 parse
,如上所示。 jq 程序的主要部分可能如下所示:
map(.props["nuget.version"]) | sort_by(parse)[]
(当然-n选项只有在使用inputs
读取时才需要。)
最高版本号
如果(正如评论中指出的那样)您只想要最高版本号,您可以简单地将最后的 []
更改为 [-1]
:
... | sort_by(parse)[-1]