Во многих нуар-приложениях я видел объявление ниже. Какова цель пропуска? Когда его использовать, а когда не использовать? Какие-то преимущества/недостатки?
:main ^{:skip-aot true} sample-app.server
Во многих нуар-приложениях я видел объявление ниже. Какова цель пропуска? Когда его использовать, а когда не использовать? Какие-то преимущества/недостатки?
:main ^{:skip-aot true} sample-app.server
Это не характерно для 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}))
Таким образом, становится немного яснее, каково ваше намерение, и вы избегаете попыток подключения к базе данных во время компиляции.
Я узнал об этом на собственном горьком опыте и задокументировал это в этой записи блога. а>.
Надеюсь, это полезно.