2012-06-24 44 views
25

在很多noir应用程序中,我看到了下面的声明。跳过aot的目的是什么?什么时候使用它,何时不使用它?任何优点/缺点?跳过AOT的原因?

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

http://clojure.org/compilation那回答了上面的问题。 – murtaza52

回答

27

这不是专门针对比诺,但你可能想跳过AOT给定命名空间的一种情况是如Heroku的部署你的代码PaaS的供应商时。

Heroku的执行你的代码默认的AOT编译所以考虑这个片段在server.clj:

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

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

原则这段代码似乎是无害的,并会在当地工作,它是AOT编译无关。

但是,在编译heroku时,环境变量“DB_URL”尚不可用,因此上述connect!语句将尝试连接到nil并引发异常。

跳过此命名空间的AOT编译是防止这种情况的一种方法。

另外,和我此刻的首选方法是稍微改变它的:

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

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

这样,它是一个更清晰一点你的意图是,你避免试图在编译过程中数据库连接。

我学会了这个难题,并将其记录在this blog post中。

希望这是有用的。

相关问题