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

问题描述:

从小烦恼开始的事情现在变成了头痛。我正在构建一个Rails 4应用程序,并使用Foreman为我的开发人员设置了Procfile和.env文件以进行配置。当我在.env文件中设置一个ENV变量时,它会被我的应用程序正确拾取。在这种情况下,我为初始化器中的Paperclip设置了一些ENV选项。为什么我的Rails初始化程序在控制台中缓存ENV变量(Foreman,Dev 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” 和运行“工头运行轨道c“或”轨道c“进入控制台,这是发生了什么情况:

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

我应该提到,这种行为也发生在我放在/ lib中的类中。我想这是因为我忽略了一些愚蠢的东西。有任何想法吗?

+0

如果你改变你的环境变量,并希望你的应用程序来提取它们,你必须重新启动应用程序。这一直是这种情况。 – nzifnab 2014-09-19 16:57:27

+0

当然可以。然而,为了澄清,在重新启动应用程序之后,这些更改不会在初始化程序中找到,但它们会在ENV哈希中拾取。 – Spencer 2014-09-19 17:23:11

+0

你是否在使用'spring'? (检查你的Gemfile。) – fny 2014-09-19 18:07:08

如果您使用Rails的4开箱即用,它带有一个名为Spring的宝石,是打算通过在后台预加载应用程序的一个实例,并重新加载它作为你的代码和配置,使您的生活更轻松文件改变。

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

对于自定义设置,弹簧读数为~/.spring.rbconfig/spring.rb。您可以添加以下行添加到您选择的文件看你.env文件更改:

Spring.watch '.env' 

Spring's configuration documentation在README以获得更多信息。

+0

辉煌,谢谢!看起来我应该更仔细地阅读升级说明:-)。 – Spencer 2014-09-19 18:22:13

+4

OMFG ...我想知道为什么重新启动控制台不会接受更改,即使我删除了flipp'n文件!我不得不完全关闭终端。谢谢你的这个!绝对令人发狂。 – manafire 2014-10-16 02:36:11

+1

从我所知道的情况来看,即使使用此修补程序,config/initializers也不会重新加载。看到这里:https://github.com/rails/spring/issues/378 – stevo 2015-02-04 23:55:02