Clojure 跳过AOT的原因?

Clojure 跳过AOT的原因?,clojure,noir,Clojure,Noir,在许多黑色应用程序中,我看到了下面的声明。跳过aot的目的是什么?何时使用,何时不使用?有什么优点/缺点吗 :main ^{:skip-aot true} sample-app.server 这并不特定于noir,但在将代码部署到PaaS提供程序(如heroku)时,您可能希望跳过给定名称空间的AOT HeloCu在默认情况下执行代码的AOT编译,请考虑服务器中的这个片段。CLJ: (db/connect! (System/getenv "DB_URL")) (defn start [po

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

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

这并不特定于noir,但在将代码部署到PaaS提供程序(如heroku)时,您可能希望跳过给定名称空间的AOT

HeloCu在默认情况下执行代码的AOT编译,请考虑服务器中的这个片段。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}))
这样可以更清楚地了解您的意图,避免在编译过程中尝试数据库连接

我以艰苦的方式学会了这一点,并将其记录在了一本书中

希望这是有用的

这就回答了上述问题。