local_env.yml在初始化程序之前未加载

时间:2016-06-17 18:34:20

标签: ruby-on-rails ruby jruby

我在config / application.rb中有以下代码来加载一些自定义本地环境变量

    require File.expand_path('../boot', __FILE__)

    require 'rails/all'

    # Require the gems listed in Gemfile, including any gems
    # you've limited to :test, :development, or :production.
    Bundler.require(*Rails.groups)

    module App

        ...

    config.before_configuration do
      env_file = File.join(Rails.root, 'config', 'local_env.yml')
      YAML.load(File.open(env_file)).each do |key, value|
        ENV[key.to_s] = value
      end if File.exists?(env_file)
    end
  end
end

我正在尝试使用railsconfig gem,因此我可以通过引用ENV哈希在settings.yml中获取敏感信息。 我的settings.yml看起来像这样:

default_request_ttl: 5
default_request_shared_key_size: 32
default_request_tunnel_provider: "SoftEther"
providers:
  soft_ether:
    server: <%= ENV["RSRS.PROVIDERS.SOFT_ETHER.SERVER"] %>
    port: "443"
    admin_hub_password: <%= ENV["RSRS.PROVIDERS.SOFT_ETHER.PASSWORD"] %>
    vpncmd_path: "/usr/local/bin/vpncmd"

问题是似乎在设置环境变量之前解析了settings.yml。这样,如果我运行rails console并调用Settings hash,这就是我得到的:

jruby-9.0.5.0 :007 > Settings
 => #<Config::Options default_request_ttl=5, default_request_shared_key_size=32, default_request_tunnel_provider="SoftEther", providers=#<Config::Options soft_ether=#<Config::Options server=nil, port="443", vpncmd_path="/usr/local/bin/vpncmd">>>

但是在一次Settings.reload之后!变量设置正确:

jruby-9.0.5.0 :002 > Settings.reload!
 => #<Config::Options default_request_ttl=5, default_request_shared_key_size=32, default_request_tunnel_provider="SoftEther", providers=#<Config::Options soft_ether=#<Config::Options server="*.*.*.*", port="443", admin_hub_password="***************", vpncmd_path="/usr/local/bin/vpncmd">>>

我已经尝试将local_env加载代码放在config / environment.rb中,但结果是一样的。有没有人知道发生了什么?

提前致谢,

2 个答案:

答案 0 :(得分:0)

看起来好像你没有解析YML文件中存在的ERB。对于我们所有的初始化器,我们首先打开文件,然后我们在YML文件中解析ERB但是执行ERB.new然后通过YML解析该结果。

以下是我们在应用程序中执行此操作的简单示例:http://ocsigen.org/js_of_ocaml/2.8/manual/bindings

一般情况下,您需要先加载配置文件,然后再按照每个解析器进行解析。

尝试以下内容:

config.before_configuration do
  require 'erb'
  env_file = File.join(Rails.root, 'config', 'local_env.yml')
  YAML.load(ERB.new(File.open(env_file))).each do |key, value|
    ENV[key.to_s] = value
  end if File.exists?(env_file)
end

答案 1 :(得分:0)

我&#34;解决了#34;我的问题是使用dotenv gem而不是尝试使用local_env文件,尽管我没有弄清楚为什么我以前的解决方案无效。