多くのノワールアプリで私は以下の宣言を見ました。 aotをスキップする目的は何ですか?いつそれを使用し、使用しない場合は?利点/欠点はありますか?AOTをスキップする理由は?
:main ^{:skip-aot true} sample-app.server
多くのノワールアプリで私は以下の宣言を見ました。 aotをスキップする目的は何ですか?いつそれを使用し、使用しない場合は?利点/欠点はありますか?AOTをスキップする理由は?
:main ^{:skip-aot true} sample-app.server
これはノワールに固有ではないが、そのような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に文書化しました。
希望すると便利です。
http://clojure.org/compilation上記の質問に答えます。 – murtaza52