Answers:
在脚本命令中设置环境变量:
...
"scripts": {
"start": "node app.js",
"test": "env NODE_ENV=test mocha --reporter spec"
},
...
然后process.env.NODE_ENV
在您的应用中使用。
注意:env
确保它可以跨平台使用。如果只关心Mac / Linux,则可以忽略它。
set NODE_ENV=test&& mocha --reporter spec
-测试和&&故意之间没有空格。
"test": "NODE_ENV=test mocha --reporter spec"
在Windows系统上不起作用。
env NODE_ENV=test mocha --reporter spec
将以本机跨平台的方式使用声明的环境变量,但关键是npm以临时和一次性的方式使用它,仅用于执行npm脚本。(它没有设置或导出以供将来参考。)只要从npm脚本运行命令,就不会有问题。同样,以这种方式删除“ &&”时也必须将其删除。
只需使用NPM包cross-env即可。超级容易。适用于Windows,Linux和所有环境。请注意,您没有使用&&转到下一个任务。您只需设置环境,然后开始下一个任务。感谢@mikekidder在建议的意见,一个在这里。
从文档:
{
"scripts": {
"build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
}
}
请注意,如果要设置多个全局变量,则只需依次声明它们,然后执行命令即可。
最终,执行的命令(使用spawn)是:
webpack --config build/webpack.config.js
该NODE_ENV
环境变量将通过交ENV被设置
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
env
或cross-env
吗?一方面,env不需要我安装任何东西,另一方面cross-env
更受欢迎。有人可以确认是否env
可以在所有平台上使用吗?
env
并非在所有平台上均能正常工作,因此cross-env
存在。只需使用cross-env
并完成它。
我只是想在这里加两美分供将来的Node-explorer使用。在我的Ubuntu 14.04上NODE_ENV=test
无法正常工作,我不得不使用export NODE_ENV=test
之后也NODE_ENV=test
开始正常工作,很奇怪。
如前所述,您必须在Windows上使用,set NODE_ENV=test
但对于跨平台解决方案,跨环境库似乎并不能解决问题,您确实需要一个库来执行此操作:
export NODE_ENV=test || set NODE_ENV=test&& yadda yadda
需要竖线,否则Windows会在无法识别的export NODE_ENV
命令:D 上崩溃。邓诺(Dunno)关于尾随空间,但只是为了确保我也将其移开了。
&&
吗?NODE_ENV=test yadda
手段“运行yadda
,设置NODE_ENV
中yadda
。的环境变量NODE_ENV=test && yadda
的意思是‘集NODE_ENV
本地环境中,但不导出它,然后运行yadda
’ NODE_ENV=test yadda
是首选的方法。
NODE_ENV=test && npm run test
或类似方式工作。我process.env["NODE_ENV"] = "testing";
在testhelper.js文件内部使用了更好的解决方案。
&&
丢失了环境变量时,仅在当前命令上设置环境变量而不导出才对当前命令起作用(这没什么)。运行与环境变量的命令而不导出ü做: NODE_ENV=test npm run test
。最后,它在导出后起作用的原因是,由于您的变量现在在会话中可用(导出),没有导出的NODE_ENV不会做任何事情。
因为我经常发现自己使用多个环境变量,所以发现将它们保存在单独的.env
文件中很有用(请确保从源代码管理中忽略它)。
VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break
然后在前面 export $(cat .env | xargs) &&
在脚本命令之前添加。
例:
{
...
"scripts": {
...
"start": "export $(cat .env | xargs) && echo do your thing here",
"env": "export $(cat .env | xargs) && env",
"env-windows": "export $(cat .env | xargs) && set"
}
...
}
为了进行测试,您可以通过运行npm run env
(linux)或npm run env-windows
(windows)查看env变量。
&&
,它的工作-如果你有多个.ENV文件,它可能是一个有点困难,以保持你的回答启发了我准备这个建议:stackoverflow.com/questions/25112510/...
通过替换在Windows上尝试以下操作YOURENV
:
{
...
"scripts": {
"help": "set NODE_ENV=YOURENV && tagove help",
"start": "set NODE_ENV=YOURENV && tagove start"
}
...
}
对于较大的环境变量集或要重用它们时,可以使用env-cmd
。
./.env
文件:
# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH
./package.json
:
{
"scripts": {
"test": "env-cmd mocha -R spec"
}
}
process.env.ENV1
mongod --dbpath ~/data/db
。我想运行类似的东西npm mongodb
,它将像往常一样获取环境变量dbpath并运行mondodb ......我想与其他成员共享它。
尽管没有直接回答问题,但我想在其他答案的基础上分享一个想法。从我得到的结果来看,每种方法都将提供一定程度的复杂性,以实现跨平台的独立性。
在我的场景中,我最初想要设置一个变量来控制是否通过JWT身份验证来保护服务器(出于开发目的)
阅读答案后,我决定仅创建2个不同的文件,分别打开和关闭身份验证。
"scripts": {
"dev": "nodemon --debug index_auth.js",
"devna": "nodemon --debug index_no_auth.js",
}
这些文件只是调用原始index.js文件(我将其重命名为appbootstrapper.js
)的包装程序:
//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);
//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);
class AppBootStrapper {
init(useauth) {
//real initialization
}
}
也许这可以帮助别人
您不应在中设置ENV变量package.json
。actionhero用于NODE_ENV
允许您更改从中的文件加载的配置选项./config
。签出redis配置文件,并查看如何使用NODE_ENV更改以下版本中的数据库选项NODE_ENV=test
如果您想使用其他ENV变量来设置内容(也许是HTTP端口),则仍然不需要更改中的任何内容package.json
。例如,如果您PORT=1234
在ENV中进行设置,并希望将其用作HTTP端口NODE_ENV=production
,则只需在相关的配置文件IE中引用它即可:
# in config/servers/web.js
exports.production = {
servers: {
web: function(api){
return {
port: process.env.PORT
}
}
}
}
npm start
命令中执行。使用上面的代码段,如果要使用ENV端口运行服务器,它将是:export PORT=1234; npm start
。您可以根据需要添加任意多个ENV声明,但它们不属于package.json文件。如果您担心要确保它们存在,则应在配置文件中使用默认值:port: process.env.PORT || 8080
。
NODE_ENV=test npm start
或由外壳设置它们
npm(和yarn)将来自package.json 的大量数据作为环境变量传递到脚本中。使用npm run env
一饱眼福。这在https://docs.npmjs.com/misc/scripts#environment中有记录,不仅适用于“生命周期”脚本prepublish
,还适用于npm run
。
您可以访问这些内部代码(例如,process.env.npm_package_config_port
在JS中),但是运行脚本的外壳程序已经可以使用它们,因此您还可以作为$npm_...
“脚本”中的扩展来访问它们(unix语法,可能在Windows上不起作用?)。
在“配置”部分,似乎用于这一用途:
"name": "myproject",
...
"config": {
"port": "8010"
},
"scripts": {
"start": "node server.js $npm_package_config_port",
"test": "wait-on http://localhost:$npm_package_config_port/ && node test.js http://localhost:$npm_package_config_port/"
}
这些“配置”字段的重要特征是 用户可以覆盖它们而无需修改package.json!
$ npm run start
> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port
Serving on localhost:8010
$ npm config set myproject:port 8020
$ git diff package.json # no change!
$ cat ~/.npmrc
myproject:port=8020
$ npm run start
> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port
Serving on localhost:8020
请参阅npm config和yarn config文档。
看来,纱读~/.npmrc
这样npm config set
既影响,但yarn config set
写入~/.yarnrc
,所以只有纱会看到它:-(
@luke的答案几乎是我需要的答案!谢谢。
由于选择的答案非常简单(而且是正确的),但是很旧,我想提供一种替代方法,用于在运行脚本并修复Luke答案的某些限制时从.env单独的文件中导入变量。尝试这个:
::: .env文件:::
# This way, you CAN use comments in your .env files
NODE_PATH="src/"
# You can also have extra/empty lines in it
SASS_PATH="node_modules:src/styles"
然后,在包json中,您将创建一个脚本,该脚本将设置变量并在您需要它们的脚本之前运行它:
::: package.json :::
scripts: {
"set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
"storybook": "npm run set-env && start-storybook -s public"
}
grep'ed cat命令中的正则表达式将清除注释和空行。
在&&
不需要被“粘”到npm run set-env
,因为它会如果你在同一个命令设置的变量是必需的。
如果您正在使用纱线,则可能会看到警告,您可以将其更改为yarn set-env
或使用npm run set-env --scripts-prepend-node-path &&
。
使用它的另一个优点是可以具有不同的环境变量。
scripts: {
"set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
"set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}
请记住,如果其中包含密钥,密码或明智/个人数据,请不要将.env文件添加到git存储库中!
在Windows中使用git bash。Git Bash与cmd处理命令的方式不同。
像这样用NODE_ENV = production设置环境变量时,大多数Windows命令提示符都会阻塞。(Windows上的Bash是例外,它使用本机Bash。)类似地,Windows和POSIX命令使用环境变量的方式也有所不同。对于POSIX,您可以使用:$ ENV_VAR,在Windows上,可以使用%ENV_VAR%。-跨环境文档
{
...
"scripts": {
"help": "tagove help",
"start": "env NODE_ENV=production tagove start"
}
...
}
使用dotenv包来声明环境变量