【问题标题】:How to check if npm script exists?如何检查 npm 脚本是否存在?
【发布时间】:2018-11-13 23:37:01
【问题描述】:

我正在创建一个 bash 脚本,该脚本贯穿我的每个项目并运行 npm run test(如果存在 test 脚本)。

我知道,如果我进入一个项目并运行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"

【问题讨论】:

    标签: bash shell npm npm-run


    【解决方案1】:

    编辑: 正如 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"
    

    如果单词 test 有其他含义,那将是一个问题 希望对你有帮助

    【讨论】:

    • 仅供参考:下面的答案(使用npm run test --if-present)是一个更好的解决方案
    • 我将添加您的建议@MarieHoeger,因为对于当前的用户案例,它确实是一个更好的解决方案,我仍然会留下我的其他解决方案,因为对于问题的确切描述(如何检查 npm 脚本存在吗?)我的解决方案可以在更多情况下使用,并且可以帮助其他用户。
    • 太棒了,谢谢@Denis!我认为我的措辞也比我的意思更直率。道歉!
    • 只是我还是 --if-present 解决方案...错了?不定义“测试”脚本,然后运行npm testnpm run testnpm run-script test 等,无论有无--is-present 标志都会给出相同的结果:&gt; echo 'Error: no test specified'Error: no test specified
    • 我在这里检查并得到了相同的行为.. 但它似乎特定于“测试”命令,对于它工作的任何其他命令。我认为如果你没有定义一个默认的测试脚本,那么它总是存在的(至少对于--if-present),但我无法在文档上支持它
    【解决方案2】:

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

    npm run test --if-present

    【讨论】:

    • 为什么这是正确的解决方案? --if-present 是做什么的?请扩展此答案。
    • --if-present 标志仅在已定义的情况下运行指定的脚本。
    • 所以在你的回答中澄清这一点。扩展它,让它成为一个真正好的答案。
    • 谢谢@詹姆斯!!这个答案救了我 :) 这是 npm 文档的链接:docs.npmjs.com/cli/run-script
    • 我希望这也适用于纱线
    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多