clojure noir

clojure - ¿Razón para saltar AOT?



noir (1)

Esto no es específico de noir, pero hay un escenario que podría querer omitir AOT para un espacio de nombres dado cuando implemente su código en un proveedor de PaaS como heroku.

Heroku realiza la compilación AOT de su código por defecto, así que considere este fragmento de código 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 inofensivo y funcionará localmente independientemente de que esté compilado por AOT.

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

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

Otro, y mi enfoque preferido en este momento sería cambiarlo ligeramente a 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, queda un poco más claro cuál es su intención y evita intentar una conexión de base de datos durante la compilación.

Aprendí esto de la manera más difícil y lo documenté en esta publicación del blog .

Espero que esto sea útil.

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

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