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

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

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

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

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

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

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

Другие вопросы по тегам