我在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中,但结果是一样的。有没有人知道发生了什么?
提前致谢,
答案 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文件,尽管我没有弄清楚为什么我以前的解决方案无效。