如何使用 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。
- 我知道 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
我不想要一个包名称列表,我想将 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"
你很亲密;您所需要的只是了解如何将键存储在变量中,这样您就可以将每个键与其对应的值组合起来形成一个字符串。
操作方法如下:
.dependencies | [ keys[] as $k | "\($k)@\(.[$k])" ] | join(" ")
keys[]
扩展为 dependencies
中的键流;使用 as $k
,我们告诉 jq 将此流的每个成员存储在一个名为 $k
的变量中,并使其在管道的右侧可用。 "\($k)@\(.[$k])"
简单地通过组合 $k
、@
和 .[$k]
形成一个字符串(即:对应于 $k
的值)。通过将这个表达式包裹在方括号之间,我们将它产生的每个值存储在一个数组中,并且通过将这个数组传递给 join(" ")
,我们通过 space 连接数组元素以形成一个字符串.就这些了。
我正在尝试编写一个脚本,以编程方式将 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
我不想要一个包名称列表,我想将 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"
你很亲密;您所需要的只是了解如何将键存储在变量中,这样您就可以将每个键与其对应的值组合起来形成一个字符串。
操作方法如下:
.dependencies | [ keys[] as $k | "\($k)@\(.[$k])" ] | join(" ")
keys[]
扩展为 dependencies
中的键流;使用 as $k
,我们告诉 jq 将此流的每个成员存储在一个名为 $k
的变量中,并使其在管道的右侧可用。 "\($k)@\(.[$k])"
简单地通过组合 $k
、@
和 .[$k]
形成一个字符串(即:对应于 $k
的值)。通过将这个表达式包裹在方括号之间,我们将它产生的每个值存储在一个数组中,并且通过将这个数组传递给 join(" ")
,我们通过 space 连接数组元素以形成一个字符串.就这些了。