我正在尝试编写一个脚本,该脚本可以通过编程方式将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