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