2012-06-24 16 views
25

En muchas aplicaciones noir he visto la siguiente declaración. ¿Cuál es el propósito de saltarse un aot? ¿Cuándo usarlo y cuándo no usarlo? ¿Alguna ventaja/desventaja?Motivo de saltarse el AOT?

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

http://clojure.org/compilation Responde a la pregunta anterior. – murtaza52

Respuesta

27

Esto no es específico noir, pero uno de los escenarios es posible que desee saltar AOT para un espacio de nombres dado es la hora de implementar su código a un proveedor de PaaS tales como heroku.

Heroku realiza AOT compilación de su código de forma predeterminada para tener en cuenta este fragmento en su server.clj:

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

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

En principio este código parece inofensiva y trabajará a nivel local, independientemente de que sea AOT-compilados.

Sin embargo, durante la compilación en heroku, la variable de entorno "DB_URL" aún no está disponible, por lo que la declaración anterior connect! intentará conectarse a nil y arrojará una excepción.

Saltar la compilación AOT de este espacio de nombres es una forma de evitar esto.

Otro, y mi enfoque preferido en el momento habría que cambiar un poco para esto:

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

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

De esa manera es un poco más claro lo que su intención es y a evitar intentar establecer una conexión de base de datos durante la compilación.

Lo aprendí de la manera difícil y lo documenté en this blog post.

Espero que esto sea útil.

Cuestiones relacionadas