当你使用NODE_ENV=production
设置环境变量的时候,大多数Windows命令提示行将会choke。(例外是Bash on Windows,使用原生bash)同样地,windows和POSIX环境命令使用环境变量的方式也不同。POSIX环境下,你使用:$ENV_VAR
,而windows环境使用%ENV_VAR%
。
cross-env
可以让你使用一个命令,所有环境通用。只要遵循POSIX系统风格即可。
npm install --save-dev cross-env
例如:
{
"scripts": {
"build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"
}
}
最终被执行的命令是:
webpack --config build/webpack.config.js
NODE_ENV
环境变量将由cross-env
设置。
你也可以将命令拆分,或者将环境变量声明从实际的命令执行中分离。如:
{
"scripts": {
"parentScript": "cross-env GREET=\"Joe\" npm run childScript",
"childScript": "cross-env-shell \"echo Hello $GREET\""
}
}
childScript
拥有实际要执行的命令,parentScript
中设置了将要使用的环境变量。这对于使用不同的环境变量启动相同的命令将非常有用,或者是环境变量太长导致无法将所有内容排在一行时。这同样意味着你可以在windows系统上使用$GREET
env变量语法。
如果你在美元符号前添加奇数个反斜杠,则不会替换表达式语句。请注意,这是指JSON字符串转移后的反斜杠。"FOO=\\$BAR"
将不会被替换,而"FOO=\\\\$BAR"
仍将替换。
最后,如果你想传入一个JSON字符串,可以这样做:
{
"scripts": {
"test": "cross-env TS_NODE_COMPILER_OPTIONS={\\\"module":\\\"commonjs\\\"} node some_file.test.ts"
}
}
特别注意双引号前的三斜杠(triple backslash),且没有用单引号。这两个条件必须满足,以同时在Windows和Unix上生效。
cross-env
模块暴露了two bins: cross-env
和cross-env-shell
。第一个使用cross-spawn
执行命令,第二个使用Node's spawn
的shell
选项。
cross-env-shell
的主要用例时当你需要在整个內联shell脚本中设置环境变量时,而不仅仅是一个命令。
例如,如果你想将环境变量应用于几个串行的命令,那么你需要将这些变量包在引号中,并使用cross-env-shell
而不是cross-env
。
{
"scripts": {
"greet": "cross-env-shell GREETING=Hi NAME=Joe \"echo $GREETING && echo $NAME\""
}
}
The rule of thumb is: 如果你要传递一个包含你想要解释执行的特别shell字符的命令,请使用cross-env-shell
。否则使用cross-env
。
I originally created this to solve a problem I was having with my npm scripts in angular-formly. This made contributing to the project much easier for Windows users.
env-cmd
- Reads environment variables from a file instead