使用 jq 检查 package.json 中是否存在 "builds" 部分

Check for presence of "builds" section in package.json using jq

我需要编写一个 shell 脚本来检查 NPM 项目的 package.json 文件中是否存在构建密钥。为此,我使用了 jqhas 函数;但得到误报。如果不熟悉 package.json,我打算在 JSON 文件中查找是否存在密钥,但密钥本身就是一个 JSON 对象(我的意思是嵌套)。

下面是使用的脚本。

if [ $(./jq 'has(".scripts.build")' package.json) == "true" ];
then
        echo "Has a build section"
else
        echo "No build section"
fi

此脚本始终命中代码的 else 部分。你能指出哪里出了问题吗?

最好将退出代码与 -e 开关一起用于此类条件。此外,您正在尝试检查对象中是否存在键,但它可能没有 ".scripts.build" 属性。它不会像您可能想的那样检查该路径。如果要使用 has/1.

,请先向下钻取对象
if ./jq -e '.scripts | has("build")' package.json > /dev/null; then
    echo "Has a build section"
else
    echo "No build section"
fi

假设 package.json 包含一个 JSON 对象,可以使用过滤器:

.scripts.build

不过,为了健壮性,建议使用:.scripts.build?

例如,如果你想找到 pwd 下所有丢失的 package.json 文件。scripts.build,你可以使用@JeffMercado 建议的策略:

find . -name package.json | while read f
do
  jq -e '.scripts.build?' "$f" > /dev/null || echo "$f"
done

或者您可以完全跳过 shell 测试,例如这是刚刚提到的任务的更好解决方案:

find . -name package.json | while read f
do
  jq -r 'select(.scripts.build? | not)
         | input_filename' "$f"
done