在npm脚本中为环境变量分配一个随机数(UUID)值

时间:2019-02-27 16:32:05

标签: npm uuid npm-scripts

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

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

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

1 个答案:

答案 0 :(得分:1)

tl; dr 当您质疑使用cross-var时,我假设需要跨平台解决方案。在这种情况下,请参考解决方案A 。但是,如果我的假设不正确,请参考解决方案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软件包和内置的execSync()的nodejs。
  • 要创建名为UUID的环境变量,我们利用内置的process.env的nodejs,并通过调用uuid()为它分配一个 uuid 值。
  • 然后我们使用ng build调用execSync命令。
  • options.stdio选项可配置父进程和子进程之间的管道-[0, 1, 2]有效地继承了stdinstdoutstderr

将JavaScript内嵌在 package.json 中。

或者,您可以在 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软件包利用上述两个解决方案之一是多余的。要卸载它,请运行:npm un -D cross-env通过您的CLI。


解决方案B:*仅适用于九个平台(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