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
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
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.
http://clojure.org/compilation Responde a la pregunta anterior. – murtaza52