2011-12-28 9 views
9

Tengo un fragmento de código de inicializador relativamente pequeño que quiero ejecutar cada vez que se ejecuta rails server, pero no cuando ejecuto rails generate, rails console o cualquier otro comando de rieles (incluidas las tareas de rake que requieren la tarea de entorno). Esta pieza de código pre-llena algunos cachés y es relativamente caro, así que realmente no quiero que se ejecute en otra cosa que rails sRails 3 inicializadores que se ejecutan solo en `rails server` y no` rails generate`, etc.

soluciones que son insatisfactorias:

capataz et al. significará que se ejecutará en un proceso diferente que es (a) excesivo para ese pequeño fragmento de código, (b) requiere comunicación entre procesos en lugar del enfoque simple en memoria que ofrece el inicializador.

En el servidor he resuelto esto configurando pasajero para pasar una variable de entorno especial a los raíles, diciéndole que se está ejecutando en el contexto del servidor. Sin embargo, me gustaría, si es posible, trabajar de forma automática en todas las máquinas de desarrollo sin recurrir a recordar ejecutar el servidor de rieles de una manera que también proporcione esa variable de entorno (es decir, IN_SERVER=true rails server).

Esta pregunta siempre se ha preguntado antes con respecto a ejecutar un inicializador cuando se ejecuta en rails server y no en rake. Sin embargo, quiero que se ejecute específicamente solo en la inicialización del servidor; la solución para el rake es excelente, pero no exhaustiva.

Respuesta

4

¿Se puede hacer algo como sobrescribir Rails::Server#initialize para que invoque el código de inicialización en el inicializador?

O, más fácil, sólo hay que poner el código en script/rails, ya que se ejecutará cada vez que se ejecuta rails server, puede tocar el violín con facilidad con ARGV o ENV allí.

+0

me gusta mucho, así que algo como '$ IN_SERVER = cierto si ARGV [0] == server'' 'en escritura/rieles es una gran solución. –

+1

No estoy seguro de que el pasajero inicie Rails con 'script/rails'. ¿Alguien realmente consiguió este método para trabajar con pasajeros? – jordanpg

0

Aquí hay una manera:

# 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