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

How do I use jq to get formatted list of package identifiers

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

这可能是微不足道的 jq,虽然我四处搜索但找不到任何东西可以做到这一点。

我最终想做的是:

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

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

我想我想做这样的事情:

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

我不想要一个包名称列表,我想将 package-name/version-range 数据的哈希值转换为包含名称和范围的字符串,如下所示:

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

好吧,我想到了这个。有用。但如果这不是惯用的方法,我欢迎改进版本。

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

POC repl

你很亲密;您所需要的只是了解如何将键存储在变量中,这样您就可以将每个键与其对应的值组合起来形成一个字符串。

操作方法如下:

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

Online demo at jqplay.org

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