json - 在 bash 中使用 jq 查找并合并所有 package.json 文件?

标签 json node.js bash jq

如何在 Bash 中使用 jq 查找所有 package.json 文件并将它们合并到一个文件中?据我所知,以下代码片段是附加文件:

find ../../projects -maxdepth 4 -type f -name "package.json" \
  -exec cat {} + | jq -s . > $(CURDIR)/node/.tmp/package.json

我尝试过使用“add”,但这似乎每次都会覆盖目标而不合并两者。

我的项目结构最初如下所示:

\ projects
  \ webapp
     \ package.json
  \ service
     \ package.json
  \ admin
     \ package.json
\ solutions
  \ killersolution
       Makefile
     \ node

make prenode之后应该看起来像这样(见下文):

\ projects
  \ webapp
     \ package.json
  \ service
     \ package.json
  \ admin
     \ package.json
\ solutions
  \ killersolution
       Makefile
     \ node
        \ .tmp
          \ package.json   <- created

我正在使用 Makefile 来启动此操作:

prenode:                                                                 
  @find ./node -type d -name ".tmp" -exec rm -rf {} +;                 
  @mkdir -p ./node/.tmp                                                
  @find ../../solutions -maxdepth 4 -type f -name "package.json" -exec cat {} + ... 

编辑#1:示例输入和输出
让我们假设找到 3 个 package.json 文件。 dependencydevDependency 不同,但必须组合起来:

找到文件 #1 ...

{
  "name":"project-a",
  "dependencies":{
    "module-a":"1.2.3"
  }
}

找到文件 #2 ...

{
  "name":"project-b",
  "dependencies":{
    "module-b":"2.3.4"
  }
}

找到文件 #3 ...

{
  "name":"project-c",
  "devDependencies":{
    "gulp":"*"
  }
}

...将全部组合起来形成以下文件:

{
  "name":"project-c",
  "dependencies":{
    "module-a":"1.2.3",
    "module-b":"2.3.4"
  },
  "devDependencies":{
    "gulp":"*"
  }
}

*注意: 最终输出文件中的 name 属性是无关紧要的。这里的关键是 dependencydevDependencies 对象的合并。

最佳答案

假设以下查找命令适合您(如有必要,请调整)

find ../../projects -name package.json

这是一个解决方案,它使用 jq * 运算符以及 reduce-s 选项来合并对象:

jq -s 'reduce .[] as $d ({}; . *= $d)' $(find ../../projects -name package.json)

如果您愿意,您可以轻松连接文件并将它们发送到 jq

find ../../projects -name package.json -exec cat {} \; | \
  jq -M -s 'reduce .[] as $d ({}; . *= $d)'

正如我在回复您的评论时所指出的,如果您在 makefile 中执行此操作,则需要采取额外的步骤来处理 $ 或将过滤器放入文件中并使用 -f

关于json - 在 bash 中使用 jq 查找并合并所有 package.json 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45681136/

相关文章:

javascript - 使用 Javascript 获取基本 JSON 值时遇到问题

java - Jackson 3.1.1 列表多态类型的子类型异常缺少类型 ID?

json - REST:如何以 "shallow"的方式将 java 对象序列化为 JSON?

javascript - 数字转 UTF-8 字符

ios - Xcode 预 ActionScript 不起作用?

javascript - 使用 jQuery 生成的表填充输入字段

javascript - waterfall API 调用的最佳架构模式

javascript - 在 NodeJS 中使用 MySQL 的 Passportjs

bash - 查找除 "."之外的所有命令

linux - 使用其他数据中的列值对基于列值的数据进行子集并在Bash中合并