将随机数(UUID)值分配给npm脚本中的环境变量

问题描述 投票:1回答:1

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

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

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

npm uuid npm-scripts
1个回答
1
投票

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


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

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

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

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

Using an external nodejs (.js) file

  1. 创建nodejs实用程序脚本。让我们将文件命名为run-ng-build.js并将其保存在项目目录的根目录中,即在package.json当前所在的目录中: 运行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的环境变量,我们使用process.env中构建的节点js,并通过调用uuid()为其指定uuid值。
  • 然后我们使用ng build调用execSync命令。
  • options.stdio选项配置父进程和子进程之间的管道 - [0, 1, 2]有效地继承了stdinstdoutstderr

Inlining your JavaScript in 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软件包使用上述两种解决方案中的任何一种都是多余的。要卸载它,请通过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)

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

的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

© www.soinside.com 2019 - 2024. All rights reserved.