Alessio Biancalana Grab The Blaster di Alessio Biancalana

JRuby lentissimo a precompilare gli asset - la risposta è NodeJS

In questi giorni al lavoro mi sono trovato davanti a una cosetta allo stesso tempo interessante e allucinante: un applicativo Rails deployato sotto JRuby (astenersi commenti tipo “OMG JRuby ma che state a fà”) che per precompilare gli asset impiegava un tempo tra i 40 e i 50 minuti, quando non si piantava tutto il job di continuous integration.

E olé, verso nuove avventure: addentrandomi un po’ dentro questa roba ho capito che rake usa l’ambiente Javascript che si trova sotto il sedere per precompilare/minificare/offuscare/quellochevepare, quindi ho sostituito il runtime a livello applicativo con tre righe semplici ma efficaci nella configurazione:

if defined?(ExecJS) && system('which node')
    ExecJS.runtime = ExecJS::Runtimes::Node
end

Questo fa si che, una volta trovato l’eseguibile di NodeJS sul filesystem, e appurato che si stia usando ExecJS per eseguire il Javascript all’interno dell’applicazione, venga utilizzato NodeJS come runtime Javascript, e non quello built-in di JRuby che causa un rallentamento notevole.

Nel nostro caso, il tempo impiegato dalla build è stato ridotto da 45 minuti medi a circa 5 minuti medi. Chiaramente questa soluzione necessita di NodeJS installato sulla macchina.

comments powered by Disqus

Member of

Previous Random Next