如何使用 jq 获取格式化的包标识符列表



我正在尝试编写一个脚本,该脚本可以通过编程方式将package.json依赖项从一个项目添加到另一个项目。

这可能是微不足道的jq,尽管我确实搜索了一下,找不到任何确切的东西。

我最终想做的是:

yarn add $(get-my-deps.sh)

所以我现在正在写get-my-deps。

  • 我知道我的 package.json 文件的路径
  • 我知道yarn add package-name@^1.23.45 package-name-2@^2.3.4做我想做的事

我想我想做这样的事情:

jq ".dependencies | keys" package.json
//                  ^ this is where I'm stuck

我不想要一个包名称列表,我想将包名称/版本范围数据的哈希转换为带有其名称和范围的字符串,如下所示:

babel@^7.3.12 react@^16.0.0 react-dom@^16.0.0 webpack@^4.0.0

我想我只是不明白如何...插入符号在 JQ 中工作。我想它在概念上等同于正则表达式反向引用。

这是JS代码:

module.exports = () => {
const package = require('./package.json')
// or, if you prefer
const FS = require('fs')
const package = FS.readFileSync('./package.json', 'utf8')
return Object.keys(package.dependencies)
// convert to array of strings: "{name}@{range}"
.reduce((modules, modName) => modules.concat(`${modName}@${package.dependencies[modName]}`), [])
// convert to single string for bash one-liner
.join(' ')
}

我相信对于任何精通jq的人来说,这是一项非常微不足道的任务,所以我将等待几天,以便人们可以花时间整理一个好的解释。

谢谢你帮我把头缠在jq上。


下面是一个示例输入:

{
"name": "chalk",
"version": "3.0.0",
"description": "Terminal string styling done right",
"license": "MIT",
"repository": "chalk/chalk",
"main": "source",
"engines": {
"node": ">=8"
},
"scripts": {
"test": "xo && nyc ava && tsd",
"bench": "matcha benchmark.js"
},
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"devDependencies": {
"ava": "^2.4.0",
"coveralls": "^3.0.7",
"execa": "^3.2.0",
"import-fresh": "^3.1.0",
"matcha": "^0.7.0",
"nyc": "^14.1.1",
"resolve-from": "^5.0.0",
"tsd": "^0.7.4",
"xo": "^0.25.3"
}
}

必须生产什么:

ansi-styles@^4.1.0 supports-color@^7.1.0

你很接近;你所需要的只是意识到如何将键存储在变量中,以便你可以将每个键与其相应的值组合在一起,形成一个字符串。

以下是您的操作方法:

.dependencies | [ keys[] as $k | "($k)@(.[$k])" ] | join(" ")

jqplay.org 在线演示

keys[]dependencies中扩展为键流;使用as $k,我们告诉jq将这个流的每个成员存储在一个名为$k的变量中,并使其在管道的右侧可用。"($k)@(.[$k])"简单地通过组合$k@.[$k](即:对应于$k的值(来形成一个字符串。通过将这个表达式包装在括号之间,我们将它产生的每个值存储在一个数组中,并且通过管道将此数组连接到join(" "),我们将数组元素连接一个空格以形成单个字符串。就这样。

嗯,我想出了这个。它有效。但是,如果这不是惯用的方式,我欢迎改进的版本。

jq ".dependencies | to_entries | map_values( .key + "@" + .value ) | join(" ")" package.json
//> "ansi-styles@^4.1.0 supports-color@^7.1.0"

POC repl

相关内容

  • 没有找到相关文章

最新更新