运行设置和使用跨平台环境变量的脚本
注意:交叉ENV仍然运行良好,但处于维护模式。不会添加新功能,只能修复严重和常见的错误,并且随着时间的推移,它只能使用node.js保持最新状态。了解更多
当您设置NODE_ENV=production时,大多数Windows命令提示都会扼杀。 (例外是Windows上的Bash,它使用本机bash。)同样,Windows和Posix命令如何利用环境变量也有所不同。使用POSIX,您使用: $ENV_VAR ,在Windows上您使用%ENV_VAR% 。
cross-env使其成为一个单个命令,而不必担心设置或适当地使用环境变量为平台。只需像在Posix系统上运行的那样设置它, cross-env将正确设置它。
cross-env vs cross-env-shell该模块是通过NPM分发的,该模块与节点捆绑在一起,应作为您项目的devDependencies之一安装:
npm install --save-dev cross-env
警告!确保安装正确拼写的软件包时,以避免错误安装恶意软件
注意:Cross-Env的版本7仅支持Node.js 10及更高版本,在Node.js 8或更低安装版本上使用它6
npm install --save-dev cross-env@6
我在我的NPM脚本中使用它:
{
"scripts" : {
"build" : " cross-env NODE_ENV=production webpack --config build/webpack.config.js "
}
}最终,执行的命令(使用cross-spawn )为:
webpack --config build/webpack.config.js
NODE_ENV环境变量将通过cross-env设置
您可以一次设置多个环境变量:
{
"scripts" : {
"build" : " cross-env FIRST_ENV=one SECOND_ENV=two node ./my-program "
}
}您还可以将命令分为几个,或将环境变量声明与实际命令执行分开。您可以这样做:
{
"scripts" : {
"parentScript" : " cross-env GREET= " Joe " npm run childScript " ,
"childScript" : " cross-env-shell " echo Hello $GREET " "
}
} childScript保留执行的实际命令,并parentScript了要使用的环境变量。然后,您不必运行父母来运行父母。这对于使用不同的ENV变量启动同一命令或环境变量太长以至于将所有内容都插入一行时非常有用。这也意味着您即使在窗口上也可以使用$GREET env env var语法,这通常要求它为%GREET% 。
如果您先于一个奇怪的后斜线,则表达式语句将不会被替换。请注意,这意味着在JSON String逃脱后的后斜线。 "FOO=\$BAR"将不会更换。 "FOO=\\$BAR"将被替换。
最后,如果要通过JSON字符串(例如,使用TS-Loader),则可以按以下方式执行以下操作:
{
"scripts" : {
"test" : " cross-env TS_NODE_COMPILER_OPTIONS={ \" module \" : \" commonjs \" } node some_file.test.ts "
}
}在双引号(")和缺少单个引号(')之前,请特别注意三重后斜线(\) 。必须满足这两个条件才能在Windows和Unix上使用。
cross-env vs cross-env-shell cross-env模块暴露了两个垃圾箱: cross-env和cross-env-shell 。第一个使用cross-spawn执行命令,而第二个使用Node的spawn中使用shell选项。
cross-env-shell的主要用例是您需要在整个Inline Shell脚本上设置一个环境变量,而不仅仅是一个命令。
例如,如果要使环境变量适用于串联的多个命令,则需要将这些变量包裹在引号中,并使用cross-env-shell而不是cross-env 。
{
"scripts" : {
"greet" : " cross-env-shell GREETING=Hi NAME=Joe " echo $GREETING && echo $NAME " "
}
}经验法则是:如果您想cross-env到包含要解释的特殊外壳字符的命令,请使用cross-env-shell 。否则坚持cross-env 。
如果您想处理程序内部的信号事件,则需要在Windows上使用cross-env-shell 。一个常见的情况是,当您想捕获通过在命令行接口上按Ctrl + C调用的SIGINT事件时。
请注意, npm默认使用cmd ,并且不支持命令替换,因此,如果您想利用它,则需要更新.npmrc将script-shell设置为PowerShell。在这里了解更多。
我最初创建了这个问题是为了解决我对NPM脚本的问题的问题。这使Windows用户更容易为项目做出贡献。
env-cmd改用文件读取环境变量@naholyr/cross-env - cross-env支持设置默认值想要贡献?寻找良好的第一期标签。
请提交错误,缺少文档或意外行为的问题。
请参阅错误
该项目处于维护模式,不会考虑新的功能请求。
了解更多
谢谢这些人(表情符号密钥):
肯特·多德斯(Kent C. Dodds) ? | Zhuang ? | 詹姆斯·哈里斯(James Harris) | Compumike08 ? | 丹尼尔·罗德里格斯·里维罗(DanielRodríguezRivero) ? | 乔纳斯·基因霍尔兹(Jonas Keinholz) ? | 雨果·伍德 ? |
Thiebaud Thomas ? | 丹尼尔·雷伊普斯(DanielReyLópez) | Amila Welihinda ? | 保罗·贝茨(Paul Betts) ? | 特纳·海斯(Turner Hayes) ? | Suhas Karanth | 斯文 |
D.NicolásLopezZelaya | 约翰·埃尔南德斯(Johan Hernandez) | 乔丹·尼尔森(Jordan Nielson) ? | 杰森·库克(Jason Cooke) | BIBO5088 | 埃里克·贝里(Eric Berry) ? | Michaëlde Boey |
劳里·埃斯科拉(Lauri Eskola) | Devuxer | 丹尼尔 |
该项目遵循全企业规范。欢迎任何形式的贡献!
注意:该项目较晚。如果您以任何方式为该项目做出了贡献,请通过按照
CONTRIBUTING.md中的说明来提出拉的请求,以将自己添加到列表中。md
麻省理工学院