【问题标题】:local_env.yml not loading before initializerslocal_env.yml 未在初始化程序之前加载
【发布时间】:2016-06-17 18:34:19
【问题描述】:

我的 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 控制台并调用 Settings 哈希,这就是我得到的:

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 中,但结果是一样的。有人知道发生了什么吗?

提前致谢,

【问题讨论】:

    标签: ruby-on-rails ruby jruby


    【解决方案1】:

    您似乎没有解析 YML 文件中存在的 ERB。对于我们所有的初始化程序,我们首先打开文件,然后解析 YML 文件中的 ERB,然后执行 ERB.new,然后通过 YML 解析结果。

    以下是我们如何在应用程序中执行此操作的简单示例:http://brandonhilkert.com/blog/using-rails-4-dot-1-secrets-for-configuration/

    不过,一般来说,您需要先加载配置文件,然后依次通过每个解析器对其进行解析。

    尝试以下方法:

    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
    

    【讨论】:

    • 对不起,我认为是误解了我。应该解析的文件是 local_env.yml ,它没有 ruby​​ 代码。 Settings.yml 是 railsconfig 加载的文件,在加载 yaml 文件之前会进行 erb 解析。问题是,虽然我在“before_config”从 local_env 读取和加载 ENV 变量,但当 railsconfig 尝试读取它们时,它们似乎不可用。
    【解决方案2】:

    我使用 dotenv gem “解决”了我的问题,而不是尝试使用 local_env 文件,尽管我不知道为什么我之前的解决方案不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多