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



我想在调用我的npm脚本时添加一个UUID参数。每次调用脚本时,我都想生成一个新号码。它应如下所示:

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

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

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


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

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

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

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

使用外部 nodejs (.js) 文件

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

    运行构建.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.jsonscripts部分中,将当前的build脚本替换为以下内容:

    包.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]有效地继承stdinstdoutstderr

package.json中内联你的JavaScript。

或者,您可以在package.jsonscripts部分中内联 nodejs/JavaScript 代码。

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

    包.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。

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


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

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

包.json

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

这利用了称为命令替换的 Bash 功能,即$(uuid).但是,如果 *nix 是您需要支持的唯一平台,那么cross-env真的没有必要。请改用内置导出功能。例如:

包.json

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

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

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

包.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中实现(非常)不同。有关进一步说明,请参阅此答案。

最新更新