我已经阅读了Twelve Factor App's Config - Section III,并在NodeJS中搜索了一种方法。似乎大多数人建议dotenv将配置存储在环境变量中。
然而,似乎dotenv与Twelve-Factor App相矛盾,因为状态:
配置的另一种方法是使用未检入修订控制的配置文件,例如Rails中的config / database.yml。这比使用在代码库中检查的常量有了很大的改进,但仍有缺点:很容易错误地将配置文件签入到repo中;配置文件倾向于分散在不同的地方和不同的格式,这使得很难在一个地方查看和管理所有配置。此外,这些格式往往是语言或框架特定的。
十二因素应用程序将配置存储在环境变量中(通常缩写为env vars或env)。在不更改任何代码的情况下,可以在部署之间轻松更改Env变量;与配置文件不同,它们几乎没有机会被意外地检入代码仓库;与自定义配置文件或其他配置机制(如Java系统属性)不同,它们是与语言和操作系统无关的标准。
理解这个陈述,似乎使用dotenv,你将创建一个配置文件.env
,然后将它们导出为环境变量。
这不会违反十二因素应用程序,因为.env
文件会被意外检入代码仓库吗?
答案 0 :(得分:2)
.env
时才会违反12因素;)
.env
文件也可以存储在repo本身之外,因为库或应用程序仍然必须读取.env
文件并将变量推送到环境中。根据您的实施情况,这可以简单到将路径从".env"
更改为"../.env"
。
使用.env
文件可以很好地让开发人员轻松管理环境,但仍然可以在部署期间与更好的环境实践兼容。我可能在虚拟机中运行30-40个12因子风格的应用程序,并且必须单独管理每个环境是没有像.env
这样的“垫片”而令人生畏。
答案 1 :(得分:1)
答案 2 :(得分:0)
OP 提出了一个深思熟虑的问题。
我认为 dotenv 与第 3 节的 12 因素相矛盾,原因有两个。
根据定义,即本段:“另一种配置方法是使用未签入版本控制的配置文件,...仍然存在弱点:很容易错误地签入配置文件到 repo; ...(因此 12-factor 应用程序使用不同的方法作为)将配置存储在环境变量中”,现在您明白了,只是因为可以/应该声明 .env
文件在 .gitignore
中,不会使 dotenv 免于“容易错误地将配置文件签入存储库”审查。
如果应用程序从并且仅从 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 要素应用原则开始的说法,但只有少数人承认它的 {{1} } 方法偏离了 12-factor app。