为什么我的Rails初始化器在控制台中缓存ENV变量(Foreman,Dev env)

时间:2014-09-19 16:52:43

标签: ruby-on-rails environment-variables development-environment foreman

最初的轻微烦恼现在变得令人头疼。我正在构建一个Rails 4应用程序,并使用Foreman进行我的开发设置,使用Procfile和.env文件进行配置。当我在.env文件中设置一个ENV变量时,它被我的应用程序正确选中。在这种情况下,我在初始化器中为Paperclip设置了一些ENV选项。

当我去改变ENV变量的值时,问题浮出水面。在控制台中,如果我键入ENV [“MY_VAR”],它将显示新值。但是,我初始化程序中使用的值(可能是在我启动控制台时运行)显示旧值!我的项目中没有任何地方列出旧值。这使我相信环境以某种方式被缓存或者env变量被导出到我的shell。我已经没有地方可以看了,所以任何帮助都会非常感激!我正在使用Ruby 1.9.3-p374和Rails 4.1.0在Mac(10.9.4)上进行开发。

示例:

ROOT / .ENV

S3_BUCKET=mybucket

配置/初始化/ paperclip.rb

Paperclip::Attachment.default_options[:s3_credentials] = {bucket: ENV["S3_BUCKET"]}

如果我将S3_BUCKET的值更改为“newbucket”并运行“foreman run rails c”或“rails c”进入控制台,则会发生以下情况:

ENV["S3_BUCKET"] # => "newbucket"
Paperclip::Attachment.default_options[:s3_credentials] # => {bucket: 'mybucket'}

我应该提一下,这种行为也发生在我放入/ lib的类中。我想这都是由于我忽略了一些愚蠢的事情。有什么想法吗?

1 个答案:

答案 0 :(得分:24)

如果您正在使用开箱即用的Rails 4,它会附带一个名为Spring的宝石,它的意图通过在后台预加载您的应用程序实例来让您的生活更轻松并在代码和配置文件发生变化时重新加载。

但是,Spring只监视Rails的默认配置文件,因此您需要配置Spring以监视您希望触发重新加载的其他任何文件。

Spring为自定义设置读取~/.spring.rbconfig/spring.rb。您可以添加以下行添加到您选择的文件中,以便查看.env文件以进行更改:

Spring.watch '.env'

有关详细信息,请参阅自述文件中的Spring's configuration documentation