2012-06-24 24 views
25

W wielu aplikacjach noir widziałem poniższą deklarację. Jaki jest cel pomijania? Kiedy go używać i kiedy go nie używać? Jakieś zalety/wady?Powód pominięcia AOT?

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

http://clojure.org/compilation To odpowiada na powyższe pytanie. – murtaza52

Odpowiedz

27

ta nie jest specyficzna dla Noir ale jeden scenariusz może chcesz pominąć AOT dla danej przestrzeni nazw jest przy wprowadzaniu kodu do dostawcy PaaS takie jak Heroku.

Heroku wykonuje AOT kompilacji kodu domyślnie więc uznać ten fragment w swojej server.clj:

(db/connect! (System/getenv "DB_URL")) 

(defn start [port] 
    (run-jetty app {:port port :join? false :max-threads 100})) 

W zasadzie ten kod wydaje się nieszkodliwe i będzie działać lokalnie bez względu na to jest AOT skompilowane.

Jednak podczas kompilacji na Heroku, zmienna środowiskowa "DB_URL" nie jest jeszcze dostępna, więc powyższe oświadczenie connect! spróbuje połączyć się z nil i wyrzucić wyjątek.

Pomijanie kompilacji AOT tej przestrzeni nazw jest jednym ze sposobów zapobiegania temu.

Innym, a mój preferowany podejście w tej chwili byłoby to zmienić nieco do tego:

(defn bootstrap! [] 
    (db/connect! (System/getenv "DB_URL"))) 

(defn start [port] 
    (bootstrap!) 
    (run-jetty app {:port port :join? false :max-threads 100})) 

ten sposób, że to trochę jaśniej co zamiarem jest i można uniknąć próby połączenia z bazą danych w czasie kompilacji.

Nauczyłem się tego na własnej skórze i udokumentowałem w this blog post.

Mam nadzieję, że jest to przydatne.

Powiązane problemy