检查package.json是否在shell脚本中具有具有特定名称的脚本,而不使用额外的NPM包

时间:2017-09-27 08:45:59

标签: node.js bash shell npm package.json

我正在测试一个更大的NPM包库,它包含私有包,公共包的变更分叉或公共包的下游。

lib
  |-package_1
  |-package_2
  |-package_N

所以我通过我的包lib运行一个shell脚本,它在npm test命令的每个目录中运行。

for D in *; do
    if [ -d "${D}" ]; then
        echo "================================="
        echo "${D}"   # PRINT DIRECTORY NAME
        echo "================================="

        cd $D
        npm run tests
        cd ../  # LEAVE PACKAGE DIR
    fi
done

不幸的是,在程序包的JSON文件中没有用于命名tests-script的唯一模式。某些软件包在test脚本下运行 watch-mode ,并且其cli脚本的名称不同(主要名为testcli)。

我想做的是类似下面的伪代码:

if has-testcli-script then
    npm run testcli
else
    npm run test

我现在假设,只存在这两个选项。我对如何知道脚本是否存在感兴趣,而不安装额外的全局NPM包。

1 个答案:

答案 0 :(得分:6)

Since npm version 2.11.4 at least, calling npm run with no arguments will list all runable scripts. Using that you can check to see if your script is present. So something like:

has_testcli_script () {
  [[ $(npm run | grep "^  testcli" | wc -l) > 0 ]]
}

if has_testcli_script; then
  npm run testcli
else
  npm test
fi

Or alternatively, just check to see if your script is in the package.json file directly:

has_testcli_script () {
  [[ $(cat package.json | grep "^    \"testcli\":" | wc -l) > 0 ]]
}