Подтвердить что ты не робот

Причина пропуска AOT?

Во многих приложениях noir я увидел декларацию ниже. Какова цель пропустить aot? Когда использовать его и когда его не использовать? Любые преимущества/недостатки?

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

Ответ 1

Это не относится к noir, но один сценарий, который вы, возможно, захотите пропустить AOT для данного пространства имен, - это развертывание вашего кода для провайдера PaaS, такого как heroku.

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}))

Таким образом, немного ясно, каково ваше намерение, и вы избегаете попытки подключения к базе данных во время компиляции.

Я изучил этот трудный путь и зафиксировал его в этом сообщении в блоге.

Надеюсь, это полезно.