多くのnoirアプリで、以下の宣言を見てきました。aotをスキップする目的は何ですか?いつ使用するのか、いつ使用しないのか?長所/短所はありますか?
:main ^{:skip-aot true} sample-app.server
これは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}))
そうすれば、意図が少し明確になり、コンパイル中にデータベース接続を試行する必要がなくなります。
私はこれを難しい方法で学び、このブログ投稿に文書化しました。
これがお役に立てば幸いです。