【问题标题】:Pass values from cmd to npm script将值从 cmd 传递到 npm 脚本
【发布时间】:2020-08-10 17:39:40
【问题描述】:

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

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

"scripts": {
    "happy-birthday": "echo Happy birthday $NAME and many returns!"
    }

输出:

Danny 生日快乐,回报丰厚!

使用如下命令:

npm run happy-birthday --NAME=Danny

到目前为止我测试的所有东西都给了我:

$NAME 生日快乐,有很多回报!

感觉就像 npm 没有将其识别为变量并将其打印为字符串。我还测试了 %NAME%。

Npm 版本 - 6.12.1

【问题讨论】:

    标签: powershell npm cmd npm-scripts


    【解决方案1】:

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

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

    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
      

      这将打印:

      Danny 生日快乐,回报丰厚!

      注意:如果您只是运行以下命令,即不传递参数:

      npm run happy-birthday
      

      它将打印默认名称:

      简生日快乐,有很多回报!


    说明:

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

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

    • Logical OR Operator,即|| 用于在没有传递参数时返回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
      

      使用 Powershell

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

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

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

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

    【讨论】:

    • 非常感谢您的快速回答!有效!您能否还提供一个传递更多参数的示例?
    • 对于多个参数,您需要将您的 npm 脚本设置为:"foo": "node -e \"console.log('First: %s Second: %s Third: %s', process.argv[1], process.argv[2], process.argv[3])\""。然后,如果您运行:npm run foo -- A B C,它将打印:First: A Second: B Third: C。我还更新了答案,向您展示您可以设置环境变量并引用它们。
    猜你喜欢
    • 2017-04-06
    • 2013-03-26
    • 2013-05-18
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多