环境变量或YAML配置文件

时间:2011-01-12 18:41:38

标签: ruby-on-rails jrubyonrails

背景:
步骤1 - >我们有一个盒子,通过在具有特定配置的测试模式下运行它来运行应用程序的单元和功能测试 步骤2 - >在步骤1成功后,我们通过在另一个框中以不同配置集的测试模式运行应用程序来运行应用程序的集成测试 步骤3 - >在步骤2成功后,我们通过在生产模式下,在性能测试框中运行应用程序的性能测试 步骤4 - >在步骤3成功后,构建被认为是稳定的,并且UAT框用该代码库更新,并且应用程序在生产模式下运行,以供客户查看和反馈。 步骤5 - >使用来自客户的GO,生产框将使用代码库进行更新。

现在,从上述步骤我们观察到,在步骤1和2中,当应用程序在测试模式下运行时,它具有不同的配置。与步骤3,4和5类似。

在这种情况下,推荐的做法是什么?我们有YAML配置文件,但我个人认为维护大量配置文件没有意义。所以,我改变了实践 “每个环境配置文件”

“每个rails模式配置文件,将变量外部化到linux环境”

我是在正确的轨道上吗?我不采取行动,简化事情吗?

这两种方法的优点和缺点是什么?

3 个答案:

答案 0 :(得分:12)

根据我的经验,环境变量是最后的配置选项。他们绝对有自己的位置,但应用程序通常应首先检查一些其他更可靠和明确有意的配置选项。我强烈建议从YAML文件加载配置,并仅使用环境变量作为后备。始终假设您的环境变量将适用于系统范围内的所有内容,并假设它会在某个时刻意外取消设置或设置为错误的值。即,您的应用程序不应提交seppuku,因为某些配置目录设置为/并且它没有权限(或者更糟糕的是您擦除了驱动器,因为应用程序运行为root)。或者更有可能的是,RAILS_ENV之类的内容设置为test时应该production并且没有人意识到,现在用户正在将数据写入错误的地方或{{1}因为所有的500个人。

就个人而言,我喜欢在我回退到配置值的环境变量时随时删除/dev/null消息。

说实话,老实说,我可能会传递配置值,以便在命令行启动哪个环境。

答案 1 :(得分:0)

在我的公司,我们实际上有两种方式。

我们有一个Rails应用程序可以指向另一个软件的许多不同安装之一,并使用该安装中的API。要指定安装,需要设置大约5个变量。

我们将这些变量中的每一个都作为单独的环境变量,但是将它们全部设置得非常快,我们不可避免地忘记了一个。

现在我们有一个环境变量,我们正在调用ENV_TOKEN,我们有yaml文件,其中包含与有效ENV_TOKEN变量对应的条目,以及config / initializers中设置ENV [key] = value的代码。

所以,假设我有变量“FOO”和“BAR”,我想分别设置为“一”和“两”。我可以创建一个包含以下内容的yaml文件:

carolclarinet:
  FOO: one
  BAR: two

然后我将环境变量ENV_TOKEN设置为carolclarinet,FOO和BAR设置为1和2。

我不知道这是否是最好的方式,但它适用于我们。

ETA:请注意,这仅用于开发和测试,我们软件的安装人员负责设置所有这些,以便我们的客户永远不会更改任何环境变量。

答案 2 :(得分:0)

经过大量的谷歌搜索,与一些铁路人员的讨论和一些知觉,我已经对代码进行了更改,以便我有“每个导轨模式的一个配置文件,将应用程序配置外部化为yml文件,在我的情况下仍然在rails环境之外“

有关详细信息,请参阅我在http://bit.ly/hpChwl

的博客文章中

感谢大家分享您的想法。希望我的解决方案让大家感兴趣:)