在许多黑色应用程序中,我看到了以下声明。跳过aot的目的是什么?何时使用它何时不使用它?有什么优点/缺点?
:main ^{:skip-aot true} sample-app.server
答案 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中记录了它。
希望这很有用。