Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reason for skipping AOT?

Tags:

clojure

noir

In many noir apps I have seen the below declaration. What is the purpose of skipping aot ? When to use it and when not to use it ? Any advantages / disadvantages ?

:main ^{:skip-aot true} sample-app.server
like image 249
murtaza52 Avatar asked Jun 24 '12 02:06

murtaza52


1 Answers

This isn't specific to noir but one scenario you might want to skip AOT for a given namespace is when deploying your code to a PaaS provider such as heroku.

Heroku performs AOT compilation of your code by default so consider this snippet in your server.clj:

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

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

In principle this code seems harmless and will work locally regardless of it being AOT-compiled.

However during compilation on heroku, the environment variable "DB_URL" isn't available yet so the connect! statement above will try to connect to nil and throw an exception.

Skipping AOT compilation of this namespace is one way of preventing this.

Another, and my preferred approach at the moment would be to change it slightly to this:

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

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

That way it's a little clearer what your intention is and you avoid attempting a database connection during compilation.

I learned this the hard way and documented it in this blog post.

Hope this is useful.

like image 110
leonardoborges Avatar answered Oct 21 '22 08:10

leonardoborges