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

最初的轻微烦恼现在变得令人头痛。 我正在构建一个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的类中。 我想这都是因为我忽略了一些愚蠢的事情。 有任何想法吗?

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

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

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

 Spring.watch '.env' 

有关详细信息,请参阅自述文件中的Spring的配置文档 。