Причина пропуска 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}))
Таким образом, вам станет понятнее, что вы собираетесь делать, и вы избегаете попытки подключения к базе данных во время компиляции.
Я усвоил этот трудный путь и задокументировал это в этом посте.
Надеюсь, это полезно.