2012-06-24 13 views
25

In molte app noir ho visto la seguente dichiarazione. Qual è lo scopo di saltare a più? Quando usarlo e quando non usarlo? Eventuali vantaggi/svantaggi?Motivo per saltare AOT?

:main ^{:skip-aot true} sample-app.server 
+0

http://clojure.org/compilation Questo risponde alla domanda precedente. – murtaza52

risposta

27

Questo non è specifico per noir, ma uno scenario che si potrebbe desiderare di saltare AOT per un determinato spazio dei nomi è quando si distribuisce il codice a un provider PaaS come Heroku.

Heroku esegue AOT compilation del codice di default in modo da considerare questo frammento nel vostro server.clj:

(db/connect! (System/getenv "DB_URL")) 

(defn start [port] 
    (run-jetty app {:port port :join? false :max-threads 100})) 

In linea di principio questo codice sembra innocuo e funziona a livello locale a prescindere che sia AOT-compilato.

Tuttavia durante la compilazione sul Heroku, la variabile d'ambiente "DB_URL" non è disponibile eppure così la dichiarazione di cui sopra connect! cercherà di connettersi a nil e un'eccezione.

Salta La compilazione di questo spazio dei nomi in AOT è un modo per impedirlo.

Un altro, e il mio approccio preferito in questo momento sarebbe quello di cambiare leggermente per questo:

(defn bootstrap! [] 
    (db/connect! (System/getenv "DB_URL"))) 

(defn start [port] 
    (bootstrap!) 
    (run-jetty app {:port port :join? false :max-threads 100})) 

In questo modo è un po 'più chiaro ciò che la vostra intenzione è e si evita di tentare una connessione al database durante la compilazione.

Ho imparato questo nel modo più difficile e l'ho documentato in this blog post.

Spero che questo sia utile.

Problemi correlati