21

我正在创建一个 bash 脚本,它贯穿我的每个项目并npm run testtest脚本存在时运行。

我知道如果我进入一个项目并运行npm run它会给我可用的脚本列表,如下所示:

Lifecycle scripts included in www:
  start
    node server.js
  test
    mocha --require @babel/register --require dotenv/config --watch-extensions js **/*.test.js

available via `npm run-script`:
  dev
    node -r dotenv/config server.js
  dev:watch
    nodemon -r dotenv/config server.js
  build
    next build

但是,我不知道如何获取该信息,查看是否test可用然后运行它。

这是我当前的代码:

#!/bin/bash

ROOT_PATH="$(cd "$(dirname "$0")" && pwd)"
BASE_PATH="${ROOT_PATH}/../.."

while read MYAPP; do # reads from a list of projects
  PROJECT="${MYAPP}"
  FOLDER="${BASE_PATH}/${PROJECT}"
  cd "$FOLDER"
  if [ check here if the command exists ]; then
    npm run test
    echo ""
  fi
done < "${ROOT_PATH}/../assets/apps-manifest"
4

2 回答 2

29

编辑: 正如 Marie 和 James 所提到的,如果您只想运行该命令(如果存在),npm 有一个选项:

npm run test --if-present

通过这种方式,您可以拥有一个可用于多个项目(可能有也可能没有特定任务)的通用脚本,而不会有收到错误的风险。

来源:https ://docs.npmjs.com/cli/run-script

编辑

你可以做一个 grep 来检查单词 test:

npm run | grep -q test

如果 npm run 中的结果包含单词 test,则返回 true

在您的脚本中,它看起来像这样:

#!/bin/bash

ROOT_PATH="$(cd "$(dirname "$0")" && pwd)"
BASE_PATH="${ROOT_PATH}/../.."

while read MYAPP; do # reads from a list of projects
  PROJECT="${MYAPP}"
  FOLDER="${BASE_PATH}/${PROJECT}"
  cd "$FOLDER"
  if npm run | grep -q test; then
    npm run test
    echo ""
  fi
done < "${ROOT_PATH}/../assets/apps-manifest"

如果测试这个词在那里有另一个含义,那将是一个问题希望它有帮助

于 2018-06-04T15:34:34.087 回答
12

正确的解决方案是使用 if-present 标志:

npm run test --if-present

于 2018-11-17T00:01:37.673 回答