2012-06-24 43 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中。

希望這是有用的。

相關問題