在多个 .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.envtest.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的主要内容,如果未能解决你的问题,请参考以下文章

import.meta.env 的打字稿类型

使用env文件切换开发环境

使用多个 env 文件

vim——打开多个文件同时显示多个文件在文件之间切换

在Jenkins管道中执行文件名中有空格的批处理

单个 UIViewcontroller,如何在多个 xib 之间切换?