【问题标题】:How to sort Artifactory package search result by version number with JFrog CLI?如何使用 JFrog CLI 按版本号对 Artifactory 包搜索结果进行排序?
【发布时间】:2019-05-07 14:31:56
【问题描述】:

我需要在 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-byoption,它也不起作用。版本号也可以包含“-beta”之类的字母。

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

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

【问题讨论】:

    标签: nuget version artifactory jq jfrog-cli


    【解决方案1】:

    您可以使用 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
    

    在您的情况下,无需再次调用 jq 即可通过修改您的程序以使用parse 来实现上述结果。 jq 程序的主要部分可能看起来像这样:

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

    (当然-n选项只有在使用inputs读取时才需要。)

    最高版本号

    如果(如评论中所示)您只想要最高版本号,您只需将最终的[] 更改为[-1]:

    ... | sort_by(parse)[-1]
    

    【讨论】:

    • 感谢您的回复。 split 是否有错字(在您的第二个代码 sn-p 处)?我尝试了几个命令,但总是得到:jq: error (at <stdin>:150): split input and separator must be strings.
    • 您的文章说“类似这样的东西”,但也许.props["nuget.version"] 并不总是一个字符串。这就是为什么遵循minimal reproducible example 准则通常是一个好主意的原因。
    • 我更新了我的问题/示例。附加第一个命令 sn-p 后,我得到以下(线性化)结果:[["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 说要找到所有,但输出却少了一个。 (如何)是否可以在没有外部 program.jq 的情况下制作单行代码?我尝试将其放入引号 (') 中,并转义了双引号 (\")。
    • 我的错 - 我忘记了 -n 选项。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2013-08-19
    • 2011-11-26
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多