跳过AOT的原因?

时间:2012-06-24 02:02:08

标签: clojure noir

在许多黑色应用程序中,我看到了以下声明。跳过aot的目的是什么?何时使用它何时不使用它?有什么优点/缺点?

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

1 个答案:

答案 0 :(得分:29)

这不是特定于黑色的,但是您可能希望跳过针对给定命名空间的AOT的一种情况是将代码部署到Paoku提供程序(如heroku)。

默认情况下,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中记录了它。

希望这很有用。