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

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

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

person murtaza52    schedule 24.06.2012    source источник
comment
clojure.org/compilation Это отвечает на поставленный выше вопрос.   -  person murtaza52    schedule 25.06.2012


Ответы (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}))

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

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

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

person leonardoborges    schedule 12.03.2013