我的解决方案如下:
由于以下两个原因,我会选择 figaro。
require_keys
如果您没有指定所有必要的配置值,figaro 有一种方法可以在初始化期间引发错误。
- 使用 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)
我做了以下发现:
- 直接使用环境变量比使用
Figaro.env
代理要快得多。
- 使用
Figaro.env
代理只需要使用rails的时间
config_for
- 使用 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 变量。