【问题标题】:Toggle between multiple .env files like .env.development with node.js在多个 .env 文件之间切换,例如 .env.development 和 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 包还是需要另一个包?或者我可以在没有任何包的情况下这样做吗?

【问题讨论】:

标签: node.js express environment-variables dotenv


【解决方案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 成为 productionnodejs.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}`)});
      

      【讨论】:

        猜你喜欢
        • 2022-10-18
        • 2019-07-11
        • 2019-02-22
        • 1970-01-01
        • 2022-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多