我想在调用我的npm脚本时添加一个UUID参数。每次调用脚本时,我都想生成一个新的数字。它应该看起来像:
"build": "cross-env UUID=unique_number ng build"
我唯一需要的是在这里生成unique_number
。我试图使用uuid包但我不知道如何在脚本中触发它并将数字作为参数传递。
tl; dr正如你的问题显示使用cross-var
我假设需要一个跨平台的解决方案。在这种情况下,请参考解决方案A.但是,如果我的假设不正确,请参阅解决方案B或C.
对于跨平台解决方案(即在Windows,Linux和macOS上成功运行的解决方案......),您需要利用nodejs来满足您的需求。有两种不同的方法可以解决这个问题,如以下两个小节所述:
注意两种方法实际上是相同的
const uuid = require('uuid/v1');
const execSync = require('child_process').execSync;
process.env.UUID = uuid();
execSync('ng build', { stdio: [0, 1, 2]} );
scripts
部分中,使用以下内容替换当前的build
脚本:
的package.json
"scripts": {
"build": "node run-ng-build"
}
说明:
execSync()
。UUID
的环境变量,我们使用process.env
中构建的节点js,并通过调用uuid()
为其指定uuid值。ng build
调用execSync
命令。options.stdio
选项配置父进程和子进程之间的管道 - [0, 1, 2]
有效地继承了stdin
,stdout
和stderr
。或者,您可以在package.json的scripts
部分内联您的nodejs / JavaScript代码。
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脚本/文件是多余的。-e
用于评估内联JavaScript。重要信息cross-env软件包使用上述两种解决方案中的任何一种都是多余的。要卸载它,请通过CLI运行:npm un -D cross-env
。
对于* 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"
}
在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。