25
在很多noir應用程序中,我看到了下面的聲明。跳過aot的目的是什麼?什麼時候使用它,何時不使用它?任何優點/缺點?跳過AOT的原因?
:main ^{:skip-aot true} sample-app.server
在很多noir應用程序中,我看到了下面的聲明。跳過aot的目的是什麼?什麼時候使用它,何時不使用它?任何優點/缺點?跳過AOT的原因?
:main ^{:skip-aot true} sample-app.server
這不是專門針對比諾,但你可能想跳過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中。
希望這是有用的。
http://clojure.org/compilation那回答了上面的問題。 – murtaza52