【问题标题】:Where to set environment variables such that they can be read from `config/initializer/*.rb`?在哪里设置环境变量以便可以从 `config/initializer/*.rb` 中读取?
【发布时间】:2012-09-14 16:38:22
【问题描述】:

我的所有环境变量都在config/initializers/app_environment_variables.rb 中,并且这个设置到目前为止一直有效,除了现在我需要使用config/environments.rbconfig/environments/*.rb 中的变量,它们似乎在config/initializer/*.rb 之前执行。

我发现this页面显示“配置顺序”如下,

  1. config/preinitializer.rb
  2. config/environment.rb
  3. config/environments/#{RAILS_ENV}.rb
  4. 插件初始化
  5. gem 初始化
  6. config/initializer/*.rb
  7. ...

但该信息来自 2009 年,而我在 Rails 3.1。我希望在“initialization”或“configuring”指南中看到此类信息,但要么我找不到该信息,要么它不存在。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1 environment-variables


    【解决方案1】:

    我在一个新的“演示”应用 (rails new demo) 中将puts "--- #{__FILE__}" 添加到以下每个文件的顶部:

    config.ru
    config/application.rb
    config/boot.rb
    config/environment.rb
    config/environments/development.rb
    config/initializers/hello.rb
    

    然后我简单地使用rails server 启动应用程序,并得到以下输出(.... 简洁):

    --- /Volumes/..../initialization-order/demo/config/boot.rb
    --- /Volumes/..../initialization-order/demo/config/application.rb
    => Booting WEBrick
    => Rails 3.2.13 application starting in development on http://0.0.0.0:3000
    => Call with -d to detach
    => Ctrl-C to shutdown server
    --- /Volumes/..../initialization-order/demo/config.ru
    --- /Volumes/..../initialization-order/demo/config/environment.rb
    --- /Volumes/..../initialization-order/demo/config/environments/development.rb
    --- /Volumes/..../initialization-order/demo/config/initializers/hello.rb
    [2013-05-16 15:05:59] INFO  WEBrick 1.3.1
    [2013-05-16 15:05:59] INFO  ruby 1.9.3 (2013-02-22) [x86_64-darwin12.3.0]
    [2013-05-16 15:05:59] INFO  WEBrick::HTTPServer#start: pid=91029 port=3000
    ^C[2013-05-16 15:06:25] INFO  going to shutdown ...
    [2013-05-16 15:06:25] INFO  WEBrick::HTTPServer#start done.
    Exiting
    

    因此初始化顺序如下:

    /config/boot.rb
    /config/application.rb
    /config.ru
    /config/environment.rb
    /config/environments/development.rb
    /config/initializers/hello.rb
    

    因此,如果您希望在 config/environments/*.rb(和 /config/initializers/*.rb 之前)之前加载环境变量,那么 read this next

    【讨论】:

      【解决方案2】:

      我建议使用foreman.env 文件来设置您的环境变量。

      1. 创建一个进入源代码管理的.env.sample 文件
      2. 创建您自己的.env 文件,并将.env 添加到.gitignore
      3. 使用foreman start 而不是rails s
      4. 享受美妙的体验(默认为端口 5000)。

      .env.sample

      AWS_ACCESS_ID=YOUR_ACCESSKEY_GOES_HERE
      ETC_ETC=ETC ETC ETC
      

      好处:

      • 您不会将敏感信息提交给源代码控制。
      • 它们确实是环境变量,在任何代码运行之前设置。

      【讨论】:

      • 如果您编辑了答案——任何反馈?这对你有用吗?
      • 感谢您的回答。我确实打算尝试您的建议,尽管我最终对我已经在做的事情略有不同。我现在在config/app_environment_variables.rb 中托管我的ENV 变量,并在config/environment.rb 中添加了两行以在environments/*.rb 之前加载该文件。 Here's my current setup. 再次,我确实打算返回您的答案。
      • 我被你在第 3 点所说的话绊倒了:“而不是rails s”。据我所知,我没有使用rails server(至少不是直接使用);我正在使用 Apache/Passenger,并且可以简单地在浏览器中加载我的任何 Rails 应用程序,其 URL 类似于 http://app_name.local/。对不起,我不明白这一点。您能否澄清第 3 点(以及第 4 点,我想,回复:端口 5000,以及为什么我需要知道这一点)?谢谢。
      • @user664833 如果您使用的是 .local,那么您使用的是 POW。使用这个:pow.cx/manual.html#section_2.2
      • 我没有使用 POW。 app_name.local 中的 .local 只是我对乘客设置中 ServerName 的偏好的一部分。
      猜你喜欢
      • 2011-01-14
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多