Rails 3初始化器只运行在“Rails server”而不是“Rails generate”上,等等



我有一个相对较小的初始化代码片段,我想在rails server运行时运行,但不是在我运行rails generate, rails console或任何其他rails命令(包括需要环境任务的rake任务)时运行。这段代码预先填充了一些缓存,并且相对昂贵,所以我真的不希望它在rails s

之外的任何东西上运行。

不满意的解:

Foreman等人将意味着它将在不同的进程上运行,这是:(a)对于那一小段代码来说,(b)需要进程间通信,而不是初始化器提供的简单的内存方式。

在服务器上,我通过配置passenger将一个特殊的环境变量传递给rails来解决这个问题,告诉它它在服务器上下文中运行。然而,我希望如果有可能在所有开发人员的机器上开箱即用,而不需要记住运行rails服务器的方式,也将提供该环境变量(即IN_SERVER=true rails server)。

rails server而不是rake中运行初始化项时,这个问题以前一直被问到。然而,我希望它只在服务器初始化时运行-修复rake是伟大的,但不是全面的。

你能做一些像重写Rails::Server#initialize这样的事情,以便它在你的初始化器中调用你的初始化代码?

或者,更简单的是,把你的代码放在script/rails中,因为每次运行rails server时都会运行它,你可以很容易地在那里摆弄ARGVENV

有一种方法:

# config/initializers/my_init.rb
Rails.application.config.after_initialize do
    # tweak this as required...
    unless defined?(::Rails::Generators) || defined?(::Rails::Console) || File.basename($0) =='rake'
        Rails.logger.info("Doing some init")
        # ...
    end
end

最新更新