6

我已阅读有关十二因素应用程序的配置 - 第 III 节的信息,并在 NodeJS 中搜索了一种方法。似乎大多数人建议使用dotenv将配置存储在环境变量中。

然而,dotenv 似乎与十二因素应用程序相矛盾,如下所述:

另一种配置方法是使用未检入修订控制的配置文件,例如 Rails 中的 config/database.yml。与使用检入代码仓库的常量相比,这是一个巨大的改进,但仍然存在弱点:很容易错误地将配置文件检入到代码仓库;配置文件倾向于分散在不同的地方和不同的格式,使得在一个地方查看和管理所有配置变得困难。此外,这些格式往往是特定于语言或框架的。

十二因素应用程序将配置存储在环境变量中(通常缩写为 env vars 或 env)。环境变量很容易在部署之间更改,而无需更改任何代码;与配置文件不同,它们被意外签入代码仓库的可能性很小;与自定义配置文件或其他配置机制(如 Java 系统属性)不同,它们是与语言和操作系统无关的标准。

理解这个声明,似乎使用 dotenv,您将创建一个配置文件.env,然后将它们导出为环境变量。

这不会违反十二因素应用程序,因为.env文件可能会意外签入代码仓库吗?

4

3 回答 3

4

在有人实际提交并推动之前,不会违反 12factor .env;)

.env文件也可以存储在存储库本身之外,因为库或应用程序仍然必须读取.env文件并将变量推送到环境中。根据您的实现,这可以像将路径从更改为一样".env"简单"../.env"

使用.env文件可能是一个很好的折衷方案,允许开发人员轻松管理环境,但在部署期间仍与更好的环境实践兼容。我可能有 30-40 个 12 因素风格的应用程序在虚拟机中运行,如果没有像.env.

于 2017-04-20T04:51:08.260 回答
1

大多数版本控制系统都有忽略某些文件的方法。

Git 有.gitignore

SVN 有“特殊忽略”

作为旁注,这些技术类似地用于忽略node_modules目录以避免不必要地复制文件。

于 2017-04-17T05:27:51.863 回答
1

OP问了一个经过深思熟虑的问题。

我会说 dotenv 与第 3 节的 12 因素相矛盾,原因有两个。

  1. 根据定义,即本段:“另一种配置方法是使用未签入修订控制的配置文件,......仍然有弱点:很容易错误地将配置文件签入回购; ...(因此 12-factor 应用程序使用不同的方法)将配置存储在环境变量中”,现在您看到了,仅仅因为.env文件可以/应该在 a 中声明.gitignore,并不能使 dotenv 免除“容易错误地签入配置”提交给 repo” 审查。

  2. 否则,如果应用程序从且仅从env var读取配置,则该应用程序可能完全符合 12 因素第 3 节。但是 dotenv 功能是允许应用程序在./.env可用时自动拾取。从这个意义上说,该.env文件——尽管它具有欺骗性的名称——一个配置文件,彻头彻尾。同样,这属于 12 因素明确避免的配置方法类别。

话虽如此,dotenv 仍然是可行的选择之一。其他选项包括:在 docker 层管理环境变量;或在 Unix 用户的.*rc文件中;或在网络服务器配置中;或在/etc/profile(引自this another SO post)。dotenv提供最通用的文件格式之一(fwiw,docker env_file 虽然它们的规格不同,但同样简单),但是dotenv它是唯一一种“污染”目标应用程序代码库的解决方案。

归根结底,dotenv很好,有趣的是,许多dotenv实现继承了它从 12-factor app 原则开始的声明,但只有少数人承认它的.env方法偏离了 12-factor app。

于 2021-01-21T11:03:46.933 回答