2012-06-24 2 views
25

많은 noir 애플 리케이션에서 나는 아래 선언을 보았다. aot를 건너 뛰는 목적은 무엇입니까? 언제 그것을 사용하고 그것을 사용하지 않을까요? 장점/단점?AOT를 건너 뛰는 이유는 무엇입니까?

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

http://clojure.org/compilation 위 질문에 대한 답입니다. – murtaza52

답변

27

이 노아에만있는 것이 아니라 같은 Heroku가 같은 PaaS를 제공하는 코드를 배포 할 때 주어진 네임 스페이스 AOT를 생략 할 수 있습니다 하나 개의 시나리오입니다.

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

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

원칙적으로이 코드는 무해한 보인다는 AOT 컴파일되는 관계없이 로컬로 작동합니다

는 Heroku가 그렇게 당신의 server.clj에서이 조각을 고려 기본적으로 코드의 AOT 컴파일을 수행한다.

그러나 heroku에서 컴파일하는 동안 환경 변수 "DB_URL"을 사용할 수 없으므로 위의 connect! 문은 nil에 연결하려고 시도하고 예외를 throw합니다.

이 네임 스페이스의 AOT 컴파일을 건너 뛰는 것이이 문제를 방지하는 한 가지 방법입니다.

또 다른, 그리고 순간에 내 선호하는 접근 방식이 약간 변경하는 것입니다 :

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

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

는 당신의 의도는 당신이 컴파일하는 동안 데이터베이스 연결을 시도 피할 것을 조금 명확입니다 그런 식으로.

나는 이것을 어려운 방법으로 알았고 this blog post에 문서화했다.

희망이 유용합니다.

관련 문제