将值从 cmd 传递到 npm 脚本

Pass values from cmd to npm script

我已经搜索了几天,但没有找到解决我的问题的答案。

我想在 Windows 中通过 cmd 或 Powershell 运行 一个 npm 脚本并传递脚本变量的值。 我想要 package.json:

中的波纹管脚本
"scripts": {
    "happy-birthday": "echo Happy birthday $NAME and many returns!"
    }

要输出:

丹尼和许多人生日快乐returns!

使用如下命令:

npm run happy-birthday --NAME=Danny

到目前为止我测试的一切都给我:

$NAME 和许多 returns!

生日快乐

感觉npm没把这个当成变量,当成字符串打印出来。我还测试了%NAME%.

Npm 版本 - 6.12.1

你不能将参数传递到 npm 脚本的中间,参数只能传递到它们的末尾。请参阅我的回答 以获得进一步的解释。

根据您的示例,考虑以下将在所有平台上成功运行的解决方案:

  1. 在你的 package.json 文件中定义你的 happy-birthday npm 脚本如下:

    "scripts": {
      "happy-birthday": "node -e \"console.log('Happy birthday %s and many returns!', process.argv[1] || 'Jane')\""
    }
    
  2. 然后运行通过cmdPowershell执行以下命令(或任何其他命令行工具)。

    npm run happy-birthday -- Danny
    

    这将打印:

    Happy birthday Danny and many returns!

    注意:如果你只是运行下面的命令,即不传递参数:

    npm run happy-birthday
    

    它将打印默认名称:

    Happy birthday Jane and many returns!


解释:

  • npm 脚本利用 nodejs 命令行选项 -e 评估内联 JavaScript 如下:

    console.log('Happy birthday %s and many returns!', process.argv[1] || 'Jane')
    
  • 通过 CLI 传递的参数,例如Danny,使用 process.argv 读取 - 由此我们引用索引 1 处的数组元素。

  • Logical OR Operator,即。 || 在没有传递参数时用于 return Jane


编辑:改为设置环境变量

或者可能要考虑设置环境变量并在 npm 脚本中引用它。

  1. 在你的 npm 脚本中定义你的 happy-birthday npm 脚本如下:

    "happy-birthday": "echo Happy birthday %NAME% and many returns!"
    

    注意 Windows 使用的 %NAME% 符号仅用于引用变量。

  2. 使用cmd

    使用 cmd(即 命令提示符)时,您需要运行以下命令:

    set NAME=Danny&& npm run happy-birthday
    

    使用电源shell

    使用 Powershell 时,您需要 运行 以下命令:

    $env:NAME="Danny" ; npm run happy-birthday
    

注意: npm 用于 npm 脚本的默认 shell 在 *nix 上是 sh 并且cmd 在 windows 上。因此,上述步骤 1 和 2 中定义的方法将在 *nix 平台上失败。

如果需要跨平台支持并且您确实希望采用这种设置环境变量并通过 npm 脚本引用它们的方法,请考虑使用 cross-env 包。