2012-06-24 7 views
25

多くのノワールアプリで私は以下の宣言を見ました。 aotをスキップする目的は何ですか?いつそれを使用し、使用しない場合は?利点/欠点はありますか?AOTをスキップする理由は?

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

http://clojure.org/compilation上記の質問に答えます。 – murtaza52

答えて

27

これはノワールに固有ではないが、そのようなHerokuのようのPaaSプロバイダにコードをデプロイする際に与えられた名前空間のためのAOTをスキップする場合があります1つのシナリオがあります。

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コンパイルをスキップすることは、これを防ぐ1つの方法です。

別の、そして現時点での私の好ましいアプローチは、これに少しそれを変更することです:

(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に文書化しました。

希望すると便利です。