跳过AOT的原因?

mur*_*a52 28 clojure noir

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

:main ^{:skip-aot true} sample-app.server
Run Code Online (Sandbox Code Playgroud)

leo*_*ges 30

这不是黑色特有的,但是您可能希望跳过给定命名空间的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}))
Run Code Online (Sandbox Code Playgroud)

原则上,这段代码似乎无害,并且无论是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}))
Run Code Online (Sandbox Code Playgroud)

这样你的意图就更清楚了,你在编译过程中避免尝试数据库连接.

我学到了很多,并在这篇博文中记录了它.

希望这很有用.