我想在调用我的npm脚本时添加一个UUID参数。每次调用脚本时,我都想生成一个新号码。它应如下所示:
"build": "cross-env UUID=unique_number ng build"
我唯一需要的是在这里生成unique_number
。我尝试使用 uuid 包,但我不知道如何在脚本中触发它并将数字作为参数传递。
tl;博士正如您的问题所示,我假设需要跨平台解决方案cross-var
的使用。在这种情况下,请参阅解决方案 A。但是,如果我的假设不正确,请参阅解决方案 B或C。
解决方案A:跨平台(Windows/Linux/macOS...)
对于跨平台的解决方案(即在Windows,Linux和macOS上成功运行的解决方案...),您需要利用nodejs来实现您的要求。有几种不同的方法可以解决此问题,如以下标题为的两个小节中所述:
- 使用外部 nodejs (.js) 文件
- 在package.json中内联你的JavaScript。
请注意,这两种方法实际上是相同的
使用外部 nodejs (.js) 文件
-
创建一个 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]} );
-
在package.json的
scripts
部分中,将当前的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]
有效地继承stdin
、stdout
和stderr
。
在package.json中内联你的JavaScript。
或者,您可以在package.json的scripts
部分中内联 nodejs/JavaScript 代码。
-
在package.json的
scripts
部分中,将当前的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中实现(非常)不同。有关进一步说明,请参阅此答案。