1

我目前正在寻找存储配置数据的最佳方式,尤其是我的 rails 4.2 应用程序中的安全凭证。

在我看来,有两个很好的解决方案。

  1. Gem Figaro(使用 ENV 和单个 YAML 文件的简单、对 Heroku 友好的 Rails 应用程序配置)。
  2. 将自定义 yml 文件与 Rails 4.2 特性config_for添加到 gitignore 以使其不受版本控制系统的影响。

两种解决方案都提供几乎相同的好处。ENv["my_variable"]通过简单的访问( vs )简单而安全地存储安全凭证,Rails.application.config_for(:my_app)["my_variable"]同时使您的配置远离 git。

我认为如果没有必要,最好避免额外的依赖。所以我倾向于结合使用自定义的 yml 文件,config_for因为它是 Rails 的内置功能。但我对环境变量没有那么丰富的经验。是否有任何优点可以证明使用附加依赖项是合理的?

4

3 回答 3

1

我的解决方案如下:

由于以下两个原因,我会选择 figaro。

  1. require_keys如果您没有指定所有必要的配置值,figaro 有一种方法可以在初始化期间引发错误。
  2. 使用 figaro,我可以更灵活地根据环境变量更改配置实现。

为了保持灵活性,我不会使用 Figaro.env 代理,而是使用纯 ENV 变量。这样我以后可以在不接触代码库的情况下更轻松地更改环境变量的实现。

此外,我对四种解决方案进行了基准测试,结果如下:

2.2.1 :016 >   n = 50000
2.2.1 :017 > Benchmark.bm do |x|
2.2.1 :018 >   x.report { n.times do ; ENV["mail_address"] ; end }
2.2.1 :019?>   x.report { n.times do ; Rails.application.config_for(:app)["mail_address"]; end }
2.2.1 :020?>   x.report { n.times do ; Figaro.env.mail_address ; end }
2.2.1 :021?>   x.report { n.times do ; Rails.configuration.x.mail_address ; end }
2.2.1 :022?> end
       user     system      total        real
   0.070000   0.010000   0.080000 (  0.078491)
  11.060000   1.260000  12.320000 ( 12.497704)
   5.600000   0.070000   5.670000 (  5.758400)
   0.050000   0.000000   0.050000 (  0.056211)

我做了以下发现:

  1. 直接使用环境变量比使用 Figaro.env代理要快得多。
  2. 使用Figaro.env代理只需要使用rails的时间 config_for
  3. 使用 Rails 配置命名空间x是最快的。

所以我最好的解决方案是:使用 figaro gem 根据您的环境设置环境变量。通过获取它们ENV['your_key']。通过 Rails 配置命名空间在初始化程序中使用它们x

例如

# config/application.yml

custom_app_id: "2954"
custom_key: "7381a978f7dd7f9a1117"
custom_secret: "abdc3b896a0ffb85d373"

# config/initializer/custom_config.rb

App::Application.configure do
  config.x.custom_app_id = ENV['custom_app_id']
  config.x.custom_key  = ENV['custom_key']
  config.x.custom_secret = ENV['custom_secret']
end

如果您需要动态值,您可以使用 Rails config_for,因为您可以将 ERB 放在 yml 文件中。

更新

我对以下结果进行了更多基准测试:

2.2.2 :015 > Benchmark.bm do |x|
2.2.2 :016 >     x.report { n.times do ; ENV["logo_file"] ; end }
2.2.2 :017?>   x.report { n.times do ; ENV["logo_file_login"] ; end }
2.2.2 :018?>   x.report { n.times do ; ENV["company_name"] ; end }
2.2.2 :019?>   x.report { n.times do ; Rails.configuration.x.logo_file ; end }
2.2.2 :020?>   x.report { n.times do ; Rails.configuration.x.logo_file_login ; end }
2.2.2 :021?>   x.report { n.times do ; Rails.configuration.x.company_name ; end }
2.2.2 :022?>   end
       user     system      total        real
   3.430000   0.030000   3.460000 (  3.503262)
   3.570000   0.030000   3.600000 (  3.642426)
   5.020000   0.040000   5.060000 (  5.133344)
   4.380000   0.040000   4.420000 (  4.508829)
   4.390000   0.030000   4.420000 (  4.470256)
   4.360000   0.040000   4.400000 (  4.442839)

在我看来,使用 ENV 变量和使用 Rails 配置命名空间没有太大区别x。因此,我将跳过附加配置文件的步骤,并在需要配置值的地方使用普通的 ENV 变量。

于 2015-09-01T11:58:56.973 回答
1

我使用选择,对我来说,额外的依赖绝对值得。gem 非常轻巧,它使处理配置变得超级容易。

我不必担心为每个不同的应用程序设置一堆开发环境变量。我只是将它全部保存在我的setting.local.yml(已添加到我的.gitignore)中。如果存在环境变量,它会拉入环境变量,但也提供了一种非常简单的方法来为本地机器定义/覆盖它们。

这是我拥有的应用程序的示例...

config/setting.yml

defaults: &defaults
  aws:
    username: <%= ENV['AWS_USERNAME'] %>
    access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
    secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
  database_url: <%= ENV['DATABASE_URL'] %>
  postmark:
    api_key: <%= ENV['POSTMARK_API_KEY'] %>

development:
  <<: *defaults

test:
  <<: *defaults

staging:
  <<: *defaults

production:
  <<: *defaults

config/setting.local.yml

development:
  database_url: postgresql://myapp_dev:myapp_dev@localhost:5432/myapp_dev

config/application.rb

module MyApp
  class Application < Rails::Application
    config.from_file 'settings.yml'
  end
end

config/initializers/postmark.rb

if Rails.configuration.postmark.api_key.present?
  Rails.application.config.action_mailer.postmark_settings = { api_key: Rails.configuration.postmark.api_key }
end
于 2015-09-02T00:35:09.223 回答
0
  • 12-factor 应用程序建议将配置存储在环境变量中,以便可以单独管理它们,而不是在“环境”(生产、joes-staging ......)中,但这仅适用于更大或不断增长的应用程序,或具有许多服务器的应用程序.
  • 然后存在错误签入文件的风险。在这种情况下更改此配置文件或环境变量是类似的,并且环境变量仍然不仅在一个地方进行管理(也在开发人员的机器上)。
  • Figaro 支持 Heroku 以轻松更新生产系统,这可能是一个加分项。
  • config_for 特性将变量全部保存在 Rails 中,因此没有将其泄露给子进程的风险,因为它可能与环境变量一起发生,但有一些解决方案(参见最后一节)。
  • 仍然 config_for 不会是您存储配置的唯一地方,至少还有 config/database.yml。
  • 因此,Rails 配置文件中的环境变量组合(例如通过 figaro 管理)可能是在一个地方管理所有配置的好解决方案。
于 2015-09-03T09:28:01.727 回答