如何从包中设置一些环境变量。Json使用NPM启动像命令?
以下是我目前在package.json中的内容:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
我想在启动脚本中设置环境变量(如NODE_ENV),同时仍然能够用一个命令启动应用程序,npm start。
如何从包中设置一些环境变量。Json使用NPM启动像命令?
以下是我目前在package.json中的内容:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
我想在启动脚本中设置环境变量(如NODE_ENV),同时仍然能够用一个命令启动应用程序,npm start。
当前回答
虽然没有直接回答这个问题,但我想在其他答案的基础上分享一个想法。从我得到的信息来看,每一个都提供了一定程度的复杂性来实现跨平台独立性。
在我的场景中,最初我只想设置一个变量来控制是否使用JWT身份验证来保护服务器(出于开发目的)
在阅读了答案后,我决定简单地创建2个不同的文件,分别打开和关闭身份验证。
"scripts": {
"dev": "nodemon --debug index_auth.js",
"devna": "nodemon --debug index_no_auth.js",
}
这些文件只是调用原始index.js文件的包装器(我将其重命名为appbootstrap .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
}
}
也许这能帮助到其他人
其他回答
虽然没有直接回答这个问题,但我想在其他答案的基础上分享一个想法。从我得到的信息来看,每一个都提供了一定程度的复杂性来实现跨平台独立性。
在我的场景中,最初我只想设置一个变量来控制是否使用JWT身份验证来保护服务器(出于开发目的)
在阅读了答案后,我决定简单地创建2个不同的文件,分别打开和关闭身份验证。
"scripts": {
"dev": "nodemon --debug index_auth.js",
"devna": "nodemon --debug index_no_auth.js",
}
这些文件只是调用原始index.js文件的包装器(我将其重命名为appbootstrap .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
}
}
也许这能帮助到其他人
对于单个环境变量
"scripts": {
"start": "set NODE_ENV=production&& node server.js"
}
对于多个环境变量
"scripts": {
"start": "set NODE_ENV=production&& set PORT=8000&& node server.js"
}
更新:由于npm RFC 21,这个解决方案可能会在npm v7中中断
警告:不知道这是否适用于纱线
NPM(和yarn)从包中传递大量数据。Json作为环境变量放入脚本中。使用npm run env查看它们。这在https://docs.npmjs.com/misc/scripts#environment中有文档,不仅适用于像prepublish这样的“生命周期”脚本,也适用于npm run执行的任何脚本。
你可以在代码中访问这些文件(例如process.env。npm_package_config_port在JS中),但它们已经可以用于运行脚本的shell,所以你也可以访问它们作为$npm_…“脚本”中的扩展(unix语法,可能在windows上不起作用?)
“config”部分似乎是用于此用途的:
"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/"
}
这些“config”字段的一个重要特性是用户可以在不修改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配置和yarn配置文档。 看起来yarn的读音是~/。NPMRC,所以NPM配置集影响两者,但yarn配置集写入~/。Yarnrc,所以只有纱线才能看到它:-(
只需使用NPM包cross-env。超级简单。适用于Windows、Linux和所有环境。注意,不要使用&&来移动到下一个任务。您只需设置env,然后开始下一个任务。感谢@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环境变量将由cross-env设置
在windows中使用git bash。Git Bash处理命令的方式与cmd不同。
当您像这样使用NODE_ENV=production设置环境变量时,大多数Windows命令提示符都会阻塞。(Windows上的Bash是个例外,它使用原生Bash。)类似地,窗口和POSIX命令利用环境变量的方式也有所不同。对于POSIX,您使用:$ENV_VAR,在windows上使用%ENV_VAR%。-交叉环境文件
{
...
"scripts": {
"help": "tagove help",
"start": "env NODE_ENV=production tagove start"
}
...
}
使用dotenv包来声明env变量