在多个 .env 文件之间切换,例如 .env.development 和 node.js

Jon*_*nas 40 environment-variables node.js express dotenv

我想为每种模式(开发、生产等)使用单独的 .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、用户、密码...

我知道我可以像这样编辑 package.json 中的脚本:

"scripts": {
    "start": "NODE_ENV=development PORT=80 node ./bin/www",
    "start-prod": "NODE_ENV=production PORT=81 node ./bin/www"
}
Run Code Online (Sandbox Code Playgroud)

但这在使用多个变量时会变得混乱。

我试过使用dotenv但似乎您只能使用 .env 文件。不是 .env.development 和 .env.production。

我可以使用 dotenv 包还是需要另一个包?或者我可以在没有任何包装的情况下做到这一点吗?

Mar*_*orn 70

您可以通过以下path选项指定要使用的 .env 文件路径:

require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` })
Run Code Online (Sandbox Code Playgroud)

  • 对于其他人:我终于用了这个:`const path = require('path'); require('dotenv').config({ path: path.join(__dirname, `../.env.${process.env.NODE_ENV}`)}); ` (9认同)
  • `NODE_ENV` 不应该用于设置应用程序环境。可以使用诸如“APP_ENV”之类的单独环境变量来实现此目的。您可能也希望非生产环境中的“NODE_ENV”为“生产”。https://nodejs.dev/learn/nodejs-the-difference- Between-development-and-Production (9认同)
  • @goldenmaza您可以在终端中运行节点服务时预加载它们,如下所示。`node -r dotenv/config app.js dotenv_config_path=/custom/path/to/your/env/vars`。另请参阅此处 https://www.npmjs.com/package/dotenv (3认同)
  • @Arst NODE_ENV 和 APP_ENV 处理单独的问题。NODE_ENV 旨在被 Node(而不是您的应用程序逻辑)理解,并且只有 2 个可能的值 - '开发' 和 '生产',Node 在内部使用它们来控制日志记录、缓存等。 APP_ENV (或任何其他名称)由应用程序(因此可以具有任何值)并用于应用程序配置 连接到“登台”数据库。因此,您甚至可能想根据需要混合不同的 NODE_ENV 和 APP_ENV 值。https://nodejs.dev/en/learn/nodejs-the-difference- Between-development-and-product/ (2认同)

Jos*_*osh 14

上面两个答案都有点偏差。让我解释。下面来自 KyleMit 的答案缺少 ./ 来指示当前目录。

  • ./ 表示Node.js中的当前目录。第二 。env 之前表示隐藏/私有文件。这就是为什么在 KyleMits 的答案中,如果 env 文件不在 PC 的根目录中,它将永远找不到它。我认为最简单的方法是添加一个 ./ 这表示"hey computer look in my current directory for this file".
//look in my current directory for this  hidden file. 
// List hidden files in dir: ls -a
 
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}`)
Run Code Online (Sandbox Code Playgroud)

  • 如果你没有 NODE_ENV 这将给出 `.env.undefined` (4认同)

Rom*_*her 11

对于打字稿:

import dotenv from 'dotenv'
dotenv.config({ path: `.env.${process.env.NODE_ENV}` })
Run Code Online (Sandbox Code Playgroud)


Mar*_*der 7

我使用custom-env npm 包来处理多个 .env 文件。只需将其放在代码的顶部即可:

require('custom-env').env();
Run Code Online (Sandbox Code Playgroud)

它将从文件加载环境变量.env.X,其中 X 是环境变量的值NODE_ENV。例如:.env.test.env.production

是关于如何使用该包的很好的教程。


Mos*_*ini 5

从上面的答案来看:这是对我有用的最终结果。

src 目录中的 .env.dev 文件。

import path from 'path';

dotenv.config({ path: path.join(__dirname, `./.env.${process.env.NODE_ENV}`)});
Run Code Online (Sandbox Code Playgroud)