在多个 .env 文件之间切换,例如 .env.development 和 node.js
Posted
技术标签:
【中文标题】在多个 .env 文件之间切换,例如 .env.development 和 node.js【英文标题】:Toggle between multiple .env files like .env.development with node.js 【发布时间】:2019-08-19 17:21:28 【问题描述】:我想为每种模式(开发、生产等)使用单独的 .env 文件。在处理我的 vue.js 项目时,我可以使用像 .env.development
或 .env.production
这样的文件来为同一个 env 键获取不同的值。 (例如:在 .env.development:FOO=BAR 和在 .env.production:FOO=BAZ,在开发模式下 process.env.FOO 将是 BAR,在生产中我会是 BAZ)。
我正在使用 Express 服务器并希望使用这些相同类型的 .env 文件来存储端口、db uri、用户、pwd...
我知道我可以像这样编辑 package.json 中的脚本:
"scripts":
"start": "NODE_ENV=development PORT=80 node ./bin/www",
"start-prod": "NODE_ENV=production PORT=81 node ./bin/www"
但是当使用多个变量时这会变得混乱。
我尝试过使用dotenv,但您似乎只能使用 .env 文件。不是 .env.development 和 .env.production。
我可以使用 dotenv 包还是需要另一个包?或者我可以在没有任何包的情况下这样做吗?
【问题讨论】:
欢迎来到 Stack Overflow。为什么在一台主机上需要多个环境文件?通常,您的开发和生产环境位于不同的主机上。 (例如,您的计算机上的开发和云中的生产)。 npmjs.com/package/dotenv#should-i-have-multiple-env-files 作为参考,这里是 Vue CLI 如何让您使用多个 .env 文件。我认为这就是乔纳斯在问题中所指的内容。我发现这种处理环境文件的方式非常有用。 cli.vuejs.org/guide/mode-and-env.html#environment-variables 【参考方案1】:您可以通过path
option 指定要使用的 .env 文件路径,如下所示:
require('dotenv').config( path: `.env.$process.env.NODE_ENV` )
【讨论】:
对于其他人:我终于同意了:const path = require('path'); require('dotenv').config( path: path.join(__dirname,
../.env.$process.env.NODE_ENV));
如果我使用这个解决方案,我似乎需要将这行代码放在我想使用 env 值的每个 javascript 文件中......是否没有全局方式,所以我只能有一行并且所有文件都访问这些值?
@goldenmaza 您可以像这样在终端中运行节点服务时预加载它们。 node -r dotenv/config app.js dotenv_config_path=/custom/path/to/your/env/vars
。参见这里npmjs.com/package/dotenv
NODE_ENV
不应用于设置应用程序环境。可以为此使用单独的环境变量,如 APP_ENV
。在非生产环境中,您可能也希望 NODE_ENV
成为 production
。 nodejs.dev/learn/…
@goldenmaza 您不需要将其放在每个 JS 文件中。您需要尽早将其添加到您的应用程序引导程序/入口点。添加后,您可以通过process.env
访问环境变量。【参考方案2】:
我正在使用custom-env npm package 来处理多个 .env 文件。只需将其放在代码的顶部即可:
require('custom-env').env();
它将从文件.env.X
加载环境变量,其中X 是你NODE_ENV
环境变量的值。例如:.env.test
或 .env.production
。
Here 是一个很好的关于如何使用这个包的教程。
【讨论】:
【参考方案3】:我只是想为遇到问题的其他人添加此内容。以上两个答案都略有偏差。让我解释。上面的人必须使用路径,如
第一个示例它缺少 ./ ./ 表示 Node.js 的当前目录。这就是为什么在第一个示例中,如果 env 文件不在 PC 的根目录中,它将永远找不到它。使用路径是一个讨厌的工作,但最好的方法是简单地添加一个 ./ 这说"hey computer look in my current directory for this file"
。 - 感谢 David J. Malan
//this says hey computer look in my current directory for this file.
require('dotenv').config( path: `./.env.$process.env.NODE_ENV` )
//I reccomend doing a console.log as well to make sure the names match*
console.log(`./.env.$process.env.NODE_ENV`)
【讨论】:
【参考方案4】:dotenv 的官方文档不建议有多个 .env 文件。
"Should I have multiple .env files? 不。我们强烈建议不要使用“主” .env 文件和 “环境” .env 文件,如 .env.test。您的配置应该有所不同 在部署之间,您不应该在之间共享值 环境。”
【讨论】:
DV bc 这会误解 OP 问题或文档:文档建议反对在同一环境中使用多个 .env 文件(例如,在同一进程中加载main.env
和 test.env
),不要笼统地建议不要拥有多个文件。
为 DV @rom5jp 道歉(如果可以的话,我会删除它)。我重新阅读了文档,听起来确实不推荐多个文件。但是,我怀疑这个建议不是针对这种情况的,因为它基本上首先否定了 .env 文件的大部分实用程序(除非您从未在本地计算机上运行多个环境)。
文档中的该声明是出于责任目的。如果您将 dotenv 用于具有不同角色/职责的大型团队的生产 NodeJS 服务器,并将机密/凭据存储在 .env 文件中 - 那么是的,Dev 永远不应访问 Prod 变量(尤其是敏感变量)。但是,您也可以使用此包存储非敏感变量,这些变量将在客户端应用程序(例如this)上跨环境(例如远程 URL)发生变化。上下文定义了应该如何使用包。
在我看来,引用的针对多个 .env 文件的建议写得不好,而且不清楚它们的含义。我同意您的配置应该因环境而异。但这意味着每个环境都需要一个 env 文件。我认为@FrozenKiwi 是对的:建议可能针对一个特定环境的多个 env 文件。
我也被dotenv的官方声明弄糊涂了。但是 FrozenKiwi 写的东西对我来说很有意义。他们反对在单个环境中使用多个 .env 的想法。并不是说我们不应该有多个 .env 来跟踪每个环境。【参考方案5】:
从上面的答案: 这是对我有用的最终结果。
.env.dev 文件在 src 目录中。
import path from 'path';
dotenv.config( path: path.join(__dirname, `./.env.$process.env.NODE_ENV`));
【讨论】:
以上是关于在多个 .env 文件之间切换,例如 .env.development 和 node.js的主要内容,如果未能解决你的问题,请参考以下文章