在许多黑色应用程序中,我看到了下面的声明。跳过aot的目的是什么?什么时候使用,什么时候不使用?有什么优点/缺点吗?
:main ^{:skip-aot true} sample-app.server发布于 2013-03-12 19:42:09
这并不是特定于noir的,但是当您将代码部署到PaaS提供程序时,您可能希望跳过给定名称空间的AOT。
默认情况下,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中。
希望这是有用的。
https://stackoverflow.com/questions/11174459
复制相似问题