2011-12-28 1 views
9

ho un relativamente piccolo pezzo di codice di inizializzazione che voglio correre ogni volta rails server piste, ma non quando corro rails generate, rails console o qualsiasi comando di altre rotaie (incluse le attività di rake che richiedono l'attività dell'ambiente). Questo pezzo di codice pre-riempie alcuni cache ed è relativamente costoso quindi ho davvero non voglio farlo girare su qualsiasi cosa, ma rails sRails 3 inizializzatori che girano solo su `rotaie server` e non` rotaie generate`, ecc

Soluzioni che sono insoddisfacenti:

Foreman et al. significherà che verrà eseguito su un processo diverso che è (a) sopra la parte superiore per quel piccolo pezzo di codice, (b) richiede la comunicazione tra processi invece del semplice approccio in memoria fornito dall'inizializzatore.

Sul server ho risolto questo problema configurando il passeggero per passare una variabile di ambiente speciale nei binari, dicendogli che è in esecuzione nel contesto del server. Tuttavia mi piacerebbe, se possibile, lavorare fuori dalla scatola su tutti i computer degli sviluppatori senza ricorrere a ricordare di eseguire il server di rotaie in un modo che fornirà anche quella variabile di ambiente (cioè IN_SERVER=true rails server).

Questa domanda è sempre stata posta prima di eseguire un inizializzatore quando è in esecuzione in rails server e non in rake. Tuttavia, voglio che venga eseguito solo nell'inizializzazione del server: la correzione per il rake è ottima ma non completa.

risposta

4

Puoi fare qualcosa come annullare Rails::Server#initialize in modo che invochi il codice di inizializzazione nel tuo inizializzatore?

O, più facilmente, basta mettere il codice in script/rails, come che verrà eseguito ogni volta che si esegue rails server, si può facilmente giocherellare con ARGV o ENV in là.

+0

mi piace molto, quindi qualcosa come '$ IN_SERVER = true se ARGV [0] == 'server'' in scrittura/rotaie è una grande soluzione. –

+1

Non sono sicuro che il passeggero avvii Rails con 'script/rails'. Qualcuno in realtà ha avuto questo metodo per lavorare con il passeggero? – jordanpg

0

Ecco un modo:

# 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