【问题标题】:Assign a random number (UUID) value to a environment variable in npm script在 npm 脚本中为环境变量分配一个随机数 (UUID) 值
【发布时间】:2019-02-28 22:18:46
【问题描述】:

我想在调用我的 npm 脚本时添加一个 UUID 参数。每次调用脚本时,我都想生成一个新号码。它应该看起来像:

"build": "cross-env UUID=unique_number ng build"

我唯一需要的是在此处生成unique_number。我尝试使用 uuid 包,但我不知道如何在脚本中触发它并将数字作为参数传递。

【问题讨论】:

    标签: npm uuid npm-scripts


    【解决方案1】:

    tl;dr 正如您的问题所示,cross-var 的使用我假设需要跨平台解决方案。在这种情况下,请参阅解决方案 A。但是,如果我的假设不正确,请参阅 Solution B 或 C。


    解决方案 A:跨平台(Windows/Linux/macOS...)

    对于跨平台解决方案(即在 Windows、Linux 和 macOS 上成功运行的解决方案......),您需要利用 nodejs 来满足您的要求。有几种不同的方法可以解决这个问题,如以下标题为以下两个小节所述:

    • 使用外部 nodejs (.js) 文件
    • 在 package.json 中内嵌 JavaScript。

    注意这两种方法实际上是相同的

    使用外部 nodejs (.js) 文件

    1. 创建一个 nodejs 实用程序脚本。让我们将文件命名为 run-ng-build.js 并将其保存在项目目录的根目录中,即在 package.json 当前所在的同一目录中:

      run-ng-build.js

      const uuid = require('uuid/v1');
      const execSync = require('child_process').execSync;
      
      process.env.UUID = uuid();
      
      execSync('ng build', { stdio: [0, 1, 2]} );
      
    2. 在 package.json 的 scripts 部分中,将当前的 build 脚本替换为以下内容:

      package.json

      "scripts": {
        "build": "node run-ng-build"
      }
      

    说明:

    • 在 run-ng-build.js 中,我们需要 uuid 包和 nodejs 内置 execSync()。
    • 要创建名为UUID 的环境变量,我们使用nodejs 内置process.env,并通过调用uuid() 为其分配一个uuid 值。
    • 然后我们使用execSync 调用ng build 命令。
    • options.stdio 选项配置父进程和子进程之间的管道 - [0, 1, 2] 有效地继承了 stdin、stdout 和 stderr。

    在 package.json 中内嵌你的 JavaScript。

    或者,您可以在 package.json 的 scripts 部分内联您的 nodejs/JavaScript 代码。

    1. 在 package.json 的 scripts 部分中,将当前的 build 脚本替换为以下内容:

      package.json

      "scripts": {
        "build": "node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng build', { stdio: [0, 1, 2]} );\""
      }
      

    说明:

    • 这实际上与上述使用单独的.js 文件的解决方案相同,但是现在使用单独的 nodejs 脚本/文件是多余的。
    • nodejs 命令行选项-e 用于评估内联JavaScript。

    重要 cross-env 包是多余的使用上述两种解决方案中的任何一种。要卸载它,请通过 CLI 运行:npm un -D cross-env。


    解决方案 B:*仅适用于 Nix 平台(Linux/MacOS...)

    对于 *nix 平台,它变得非常简洁,您可以在 package.json 中定义您的 build 脚本,如下所示:

    package.json

    "scripts": {
      "build": "cross-env UUID=$(uuid) ng build"
    }
    

    这利用了称为command substitution 的 Bash 功能,即$(uuid)。但是,如果 *nix 是您需要支持的唯一平台,那么 cross-env 确实没有必要。请改用内置的export 功能。例如:

    package.json

    "scripts": {
      "build": "export UUID=$(uuid) && ng build"
    }
    

    解决方案 C:仅限 Windows (cmd.exe)

    在通过命令提示符或 PowerShell 运行的 Windows(仅限)上,您可以执行以下操作:

    package.json

    "scripts": {
      "build": "FOR /F %U IN ('uuid') DO cross-env UUID=%~U node -e \"process.env.UUID = require('uuid/v1')(); require('child_process').execSync('ng buuld', { stdio: [0, 1, 2] });\""
    }
    

    这类似于 解决方案 B 中显示的第一个示例,但是在 cmd.exe 中实现命令替换(非常) 的方式不同。请参阅此answer 以获取更多说明。

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 1970-01-01
      • 2019-02-09
      • 2014-05-23
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多