在许多黑色应用程序中,我看到了以下声明.跳过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)
这样你的意图就更清楚了,你在编译过程中避免尝试数据库连接.
我学到了很多,并在这篇博文中记录了它.
希望这很有用.