如何从包中设置一些环境变量。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。
当前回答
更新:由于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,所以只有纱线才能看到它:-(
其他回答
如果你:
目前正在使用Windows; 安装git bash; 不要在包中使用set ENV。json,这使得它只能在Windows开发机器上运行;
然后将node的脚本shell从cmd设置为git bash,并在package中编写linux风格的env设置语句。json使它能够在Windows/Linux/Mac上工作。
$ npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
你不应该在package.json中设置ENV变量。actionhero使用NODE_ENV允许您更改从./config文件中加载的配置选项。检查redis配置文件,并查看如何使用NODE_ENV来更改NODE_ENV=test中的数据库选项
如果你想使用其他ENV变量来设置东西(也许是HTTP端口),你仍然不需要改变package.json中的任何东西。例如,如果你在ENV中设置了PORT=1234,并且想在NODE_ENV=production中使用它作为HTTP端口,只需在相关的配置文件IE中引用它:
# in config/servers/web.js
exports.production = {
servers: {
web: function(api){
return {
port: process.env.PORT
}
}
}
}
因为我经常需要处理多个环境变量,所以我发现将它们保存在一个单独的.env文件中很有用(请确保在源代码控制中忽略这一点)。然后(在Linux中)在启动应用程序之前在脚本命令中前置export $(cat .env | xargs) &&。
例如。env文件:
VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break
示例index.js:
console.log('Test', process.env.VAR_A, process.env.VAR_B);
示例package.json:
{
...
"scripts": {
"start": "node index.js",
"env-linux": "export $(cat .env | xargs) && env",
"start-linux": "export $(cat .env | xargs) && npm start",
"env-windows": "(for /F \"tokens=*\" %i in (.env) do set %i)",
"start-windows": "(for /F \"tokens=*\" %i in (.env) do set %i) && npm start",
}
...
}
不幸的是,我似乎不能通过从脚本中调用脚本来设置环境变量——比如“start-windows”:“npm run env-windows && npm start”——所以脚本中有一些冗余。
对于一个测试,你可以通过运行npm run env-linux或npm run env-windows来查看env变量,并通过运行npm run start-linux或npm run start-windows来测试它们是否进入了你的应用程序。
虽然没有直接回答这个问题,但我想在其他答案的基础上分享一个想法。从我得到的信息来看,每一个都提供了一定程度的复杂性来实现跨平台独立性。
在我的场景中,最初我只想设置一个变量来控制是否使用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
}
}
也许这能帮助到其他人
当NODE_ENV环境变量被设置为“production”时,包中的所有devDependencies。当运行NPM install时,Json文件将被完全忽略。你也可以使用——production标志来强制执行:
npm install --production
要设置NODE_ENV,您可以使用这些方法中的任何一种
方法一:为所有节点应用设置NODE_ENV
窗口:
set NODE_ENV=production
Linux、macOS或其他基于unix的系统:
export NODE_ENV=production
这将为当前bash会话设置NODE_ENV,因此在此语句后启动的任何应用程序都将NODE_ENV设置为生产。
方法2:设置当前应用的NODE_ENV
NODE_ENV=production node app.js
这将仅为当前应用设置NODE_ENV。当我们想要在不同的环境中测试应用程序时,这很有帮助。
方法三:创建。env文件并使用
这使用了这里解释的想法。请参考这篇文章了解更详细的解释。
基本上,您创建一个.env文件,并运行一些bash脚本在环境上设置它们。
为了避免编写bash脚本,可以使用env-cmd包来加载.env文件中定义的环境变量。
env-cmd .env node app.js
方法四:使用跨环境包
这个包允许以一种方式为每个平台设置环境变量。
在用npm安装它之后,你可以把它添加到你的部署脚本中。Json格式如下:
"build:deploy": "cross-env NODE_ENV=production webpack"