Проверьте наличие раздела "builds" в package.json, используя jq - PullRequest
1 голос
/ 28 июня 2019

Мне нужно написать скрипт оболочки, чтобы проверить наличие ключа сборки в файле package.json для проекта NPM. Для этого я использую функцию has из jq; но получать ложные срабатывания. Если вы не знакомы с 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 часть кода. Можете ли вы указать, где я иду не так.

Ответы [ 2 ]

2 голосов
/ 28 июня 2019

Лучше использовать код выхода с переключателем -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
1 голос
/ 28 июня 2019

Если предположить, что package.json содержит объект JSON, с фильтром можно обойтись:

.scripts.build

Для надежности, возможно, было бы целесообразно использовать: .scripts.build?

Например, если вы хотите найти все файлы package.json под pwd, в которых отсутствует .scripts.build, вы можете воспользоваться стратегией, предложенной @JeffMercado:

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

Или вы можете полностью пропустить тест оболочки, например, Вот лучшее решение только что упомянутой задачи:

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