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

Jan*_*nkt 5 bash shell node.js npm package.json

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

lib
  |-package_1
  |-package_2
  |-package_N
Run Code Online (Sandbox Code Playgroud)

所以我通过我的包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
Run Code Online (Sandbox Code Playgroud)

遗憾的是,在程序包的JSON文件中没有用于命名tests-script的唯一模式.某些程序包在test具有监视模式的脚本下运行,并且其cli脚本具有不同的名称(主要是命名testcli).

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

if has-testcli-script then
    npm run testcli
else
    npm run test
Run Code Online (Sandbox Code Playgroud)

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

Max*_*nas 7

至少从npm版本2.11.4开始,npm run没有参数的调用将列出所有可运行的脚本.使用它,您可以检查您的脚本是否存在.所以类似于:

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

if has_testcli_script; then
  npm run testcli
else
  npm test
fi
Run Code Online (Sandbox Code Playgroud)

或者,只需检查您的脚本是否直接在package.json文件中:

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