30

多くのnoirアプリで、以下の宣言を見てきました。aotをスキップする目的は何ですか?いつ使用するのか、いつ使用しないのか?長所/短所はありますか?

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

1 に答える 1

32

これはnoirに固有のものではありませんが、特定の名前空間でAOTをスキップしたいシナリオの1つは、コードを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}))

原則として、このコードは無害に見え、AOTコンパイルされているかどうかに関係なくローカルで機能します。

ただし、herokuでのコンパイル中は、環境変数 "DB_URL"はまだ使用できないため、connect!上記のステートメントは接続を試みてnil例外をスローします。

この名前空間のAOTコンパイルをスキップすることは、これを防ぐ1つの方法です。

もう1つ、現時点での私の好ましいアプローチは、これを少し変更することです。

(defn bootstrap! []
  (db/connect! (System/getenv "DB_URL")))

(defn start [port]
  (bootstrap!)  
  (run-jetty app {:port port :join? false :max-threads 100}))

そうすれば、意図が少し明確になり、コンパイル中にデータベース接続を試行する必要がなくなります。

私はこれを難しい方法で学び、このブログ投稿に文書化しました。

これがお役に立てば幸いです。

于 2013-03-12T11:42:08.590 に答える