有没有办法获取传递给该脚本指定的命令的 npm 脚本的名称?

Eri*_*ric 8 npm npm-scripts yarnpkg

使用npm或yarn,npm脚本指定的脚本是否可以知道npm脚本本身的名称?例如:

"scripts": {
  "foo": "echo Original command: $0",
  "bar": "echo Original command: $0"
}
Run Code Online (Sandbox Code Playgroud)

我希望这两个脚本的结果类似于:

Original command: yarn run foo
Original command: yarn run bar
Run Code Online (Sandbox Code Playgroud)

但我实际得到的是:Original command: /bin/sh

如果它有所不同,它只是我需要的脚本的名称,而不是部分yarn run,所以像这样的输出Original command: foo就可以了。

Rob*_*obC 8

NPM 添加npm_lifecycle_event环境变量。它类似于package.json vars

*Nix(Linux、macOS、...)

*nix平台上,npm 使用sh作为运行 npm 脚本的默认 shell,因此您的脚本可以定义为:

"scripts": {
  "foo": "echo The script run was: $npm_lifecycle_event",
  "bar": "echo The script run was: $npm_lifecycle_event"
}
Run Code Online (Sandbox Code Playgroud)

注意:$引用变量的美元前缀。

视窗:

在 Windows 上,npm 使用cmd.exe作为运行 npm 脚本的默认 shell,因此您的脚本可以定义为:

"scripts": {
  "foo": "echo The script run was: %npm_lifecycle_event%",
  "bar": "echo The script run was: %npm_lifecycle_event%"
}
Run Code Online (Sandbox Code Playgroud)

注意:%用于引用变量的前导和尾随百分号。

跨平台(Linux、macOS、Windows...)

对于跨平台,您可以:

  1. 利用cross-var启用单一语法,即$按照*nix语法使用美元符号前缀。

  2. 或者,利用 node.js 命令行选项-p来评估并打印以下内联 JavaScript 的结果:

    "scripts": {
      "foo": "node -e \"console.log('The script run was:', process.env.npm_lifecycle_event)\"",
      "bar": "node -e \"console.log('The script run was:', process.env.npm_lifecycle_event)\""
    }
    
    Run Code Online (Sandbox Code Playgroud)

    注意在这个例子中我们:

    • npm_lifecycle_event使用node.js process.env属性访问环境变量。
    • 使用console.log(而不是echo)将结果打印到stdout