Analisi del processo di inizializzazione del framework Ruby on Rails

Posted by Dibi Store Wed, 09 Jan 2008 08:22:00 GMT

Ruby on Rails è un framework di qui ho già sicuramente parlato molto, infatti ci lavoro fortunatamente ogni giorno a stretto contatto. Credo che chiunque lo abbia utilizzato almeno una volta abbia voluto sapere cosa succede realmente dietro le quinte di questa gemma. Per questo ho scritto questo articolo che descrive il processo di inizializzazione del framework. Per gli esempi prenderò come riferimento l'attuale versione 2.0.2 .

Innanzitutto consiglio per seguire meglio gli esempi di creare un progetto vuoto che chiameremo course, vi consiglio di tenere questo progetto sempre disponibile, in quanto verrà usato direttamente in articoli futuri. L'ultimo passo è quello di 'congelare' l'attuale versione di rails con il comando:

  rails course
  cd course/
  rake rails:freeze:gems

In alterativa potete scegliere il nome che volete, non ha particolare importanza. Aprendo il file config/database.yml, noterete subito che l'adattatore di default non è più mysql, bensì sqlite3. Ciò ci da un vantaggio immediato, infatti non abbiamo bisogno di andare a creare il database manualmente (anche se avremo potuto usare il comando rake db:create oppure rake db:create:all). A questo punto aprite il vostro IDE preferito, e iniziamo il nostro tour!

Il file dispatcher.rb dentro alla directory /public, è il primo che normalmente viene analizzato (in circostanze normali), nella prima riga vediamo che viene specificato come commento (un commento speciale a dire il vero) il percorso del nostro interprete. Ciò potrà non interessare a molti, ma ciò potrebbe dare in qualche modo fastidio alla macchina in qui effettuerete l'eventuale deploy (analizzeremo anche quello in futuro!) Sappiate che potete usare un trucchetto in molti casi, ossia dichiarare /usr/bin/env ruby, oppure dichiarare esplicitamente il percorso nel momento della generazione del progetto utilizzando l'opzione -r (provate in console a dare il comando rails -h se non lo avete mai fatto). Bando alle ciance, l'unica cosa importante è che viene 'richiesto' il file /config/environment.rb, ammeno che rails non sia gia stato inizializzato (non volete mica carica tutto il framework ogni volta, vero?).
Il file /config/environment.rb dapprima dichiara la versione di rails da utilizzare, poi caricherà il file boot.rb, che si trova nella stessa directory. Questo file dapprima definirà la variabile RAILS_ROOT che indicherò appunto la directory radice del progetto, dopodichè deciderà da dove andare a caricare il framework, in sostanza se è presente una directory /vendor/rails, il framework sarà caricato da li, altrimenti sarà caricato dalla vostra gemma presente nel sistema.

Qui possiamo notare una prima cosa interessante. Osservando il metodo preinitialize, all'incirca alla riga 29, potete notare che rails tenta di caricare un file, precisamente in /config/preinitializer.rb, ovviamente noi questo file andremo a crearlo (siamo [hacker|curiosi|non abbiamo un * da fare] o no?), e ci inseriremo il codice seguente, dopodichè avvieremo il server:

  puts "Ciao dal preinizializzatore!\n\n"
  
  # Salviamo e da console diamo:
  ./script/server
  
  dibistore:course oskar$ ./script/server
  Ciao dal preinizializzatore!

  => Booting Mongrel (use 'script/server webrick' to force WEBrick)
  => Rails application starting on http://0.0.0.0:3000
  => Call with -d to detach
  => Ctrl-C to shutdown server
  ** Starting Mongrel listening at 0.0.0.0:3000
  ** Starting Rails with development environment...
  ** Rails loaded.
  ** Loading any Rails specific GemPlugins
  ** Signals ready.  TERM => stop.  USR2 => restart.  INT => stop (no restart).
  ** Rails signals registered.  HUP => reload (without restart).  It might not work well.
  ** Mongrel 1.1.3 available at 0.0.0.0:3000
  ** Use CTRL-C to stop.
  

Fantastico, abbiamo appena scoperto un modo per inserire del codice ancora prima che venga caricato qualsiasi dato, questo apre molte possibilità, ma non è finita qui, infatti a questo punto caricheremo il file /vendor/rails/railties/lib/initializer.rb. Due parole per capire meglio: questa parte di rails, (railties) serve a collegare insieme i vari componenti (active record, action pack eccetera). Infatti nelle prime righe vengono impostate alcune costanti, aggiunti dei file alla load_path (tramite $LOAD_PATH.unshift File.dirname(__FILE__)) e dichiarato l'environment attuale (molto importante).
Il metodo che ora verrà chiamato è self.run, che potete ispezionare con calma, valutando le possibilità, poco sotto questo metodo vedete anche (commentato) l'elenco delle cose che vengono caricate da rails e il loro ordine, che qui traduco per semplicità:

  # * #controlla la versione di ruby (deve essere almeno la 1.2 ma non la 1.3)
  # * #inserisci i percorsi dei file nella load_path
  # * #carica i vari frameworks (active record ecc.)
  # * #inserisci altri percorsi nella load_path
  # * #aggiungi la directory dei plugin alla load_path (ma non li carica)
  # * #carica il file dell'environment corrente (/config/envrionments/whatever)
  # * #inizializza encoding
  # * #inizializza database (prepara connessione ecc.)
  # * #inizializza il logger
  # * #initializza e configura il logging dei vari frameworks
  # * #inizializza le viste dei frameworks
  # * #inizializza le dipendenze
  # * #inizializza whiny_nil (estende la class Nil, dandoci degli errori più utili)
  # * #inizializza directory temporanee
  # * #inizializza le configurazioni dei frameworks
  # * #aggiunge altri percorsi alla load_path
  # * #carica i plugins
  # * #carica gli observers (/config/initializers/)
  # * #inizializza il processo di routing
  # * #carica eventuali metodo definiti in /config/environment.rb chiamati after_initialize
  # * #carica il tutto

Il nome inizializzatore è più che azzecato, ovviamente non posso descrivere ora nel dettaglio ognuno di questi passi, per qui lo farò man mano nel tempo e pubblicherò degli articoli più dettagliati qui sul blog. Vi consiglio di continuare da soli a questo punto il processo di riscoperta dell'inizializzazione, in quanto è tempo sempre ripagato (che bello ruby).

Posted in  | Tags  | no comments | no trackbacks

Comments

Trackbacks

Use the following link to trackback from your own site:
http://www.dibistore.com/trackbacks?month=01&year=2008&article_id=analisi-del-processo-di-inizializzazione-del-framework-ruby-on-rails&day=09

(leave url/email »)

   Preview comment