2017-12-11 25 views
1

Clojure를 처음 테스트하고 간단한 websocket 클라이언트 응용 프로그램을 작성하려고했습니다. 라이브러리 https://github.com/stylefruits/gniazdo을 찾았으며 작동 코드 (lein run 사용)가 있습니다. 그러나 항아리에 코드를 컴파일 (중 lein jar 또는 lein uberjar는 하나 붙어 또는 (~ 1 시간 후에 중단) 시대를 필요로)Clojure 컴파일 시간

단계 :

  1. lein new app testing
  2. 수정 SRC/테스트/코어. CLJ 및 project.clj (아래 참조) 단순 들어
  3. lein jar (또는 lein uberjar)

내가 가진했습니다 이미 나이 소요이 매우 간단한 코드, 항아리로 컴파일합니다 :

(ns testing.core 
    (:gen-class)) 

(require '[gniazdo.core :as ws]) 

(def socket 
    (ws/connect 
      "wss://some.url.com/")) 

(defn -main 
    "I don't do a whole lot ... yet." 
    [& args] 
    (ws/close socket)) 

project.clj : lein jar를 실행

(defproject testing "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.8.0"] 
       [stylefruits/gniazdo "1.0.1"]] 
    :main ^:skip-aot testing.core 
    :aot [testing.core] 
    :target-path "target/%s" 
    :profiles {:uberjar {:aot :all}}) 

출력 : aferwards

$lein jar 
Compiling testing.core 
2017-12-11 14:15:14.813:INFO::main: Logging initialized @1352ms 

아무것도를. 이 정상적인 동작입니까 (컴파일하는 데 오랜 시간이 걸립니다) 아니면 여기에 뭔가 빠졌습니까? Clojure는 매우 흥미로 보입니다. 그러나 컴파일 시간이 아주 짧은 경우에도 배포가 문제가 될 수 있습니다. 네임 스페이스가 (당신의 project.clj에 :aot [testing.core]) 미리의 를 컴파일 할 때

+3

다음 중 하나를 수행하십시오. 1. 최상위 레벨에서 연결하지 마십시오. 2. 'testing.core' 네임 스페이스를 사용하지 마십시오. 연결을 JAR에 어떻게 저장해야한다고 생각하십니까? – ClojureMostly

답변

3

,이 코드는 컴파일 중에 평가됩니다 :

(def socket 
    (ws/connect "wss://some.url.com/")) 

이 걸림의 원인이 무엇을 가능성이있다. 컴파일러는 블로킹 호출을했기 때문에이 작업을 수행하지 않습니다.

  1. 당신이 그것을 필요하지 않은 경우에는 :aot 지시어를 제거 할 수 있습니다 (그리고 당신은 아마하지 않습니다). 새로운 Leiningen 프로젝트를 만들 때 이것이 다소 혼란 스러울 수 있습니다.

  2. 당신은 delay A의 그 소켓/CONN 포장과 같이 할 수있다 :

    (def socket (delay (ws/connect "wss://some.url.com/"))) 
    

    그리고 deref/@을 당신이 값이 필요합니다 곳입니다. 이 질문이있을 때까지 평가는 ws/connect입니다.

+0

정확하게 이해할 수 있을지 모르겠다. AOT 컴파일은 실제로 소켓의 정의를 나타내는 바이트 코드를 작성하는 대신 코드를 실행한다. 이 경우에도 작동합니다 : (defn socket [url] (ws/connect url)) – Moe

+2

@Moe 예, 클로저 코드를 컴파일하는 유일한 방법은 그것이 상주하는 네임 스페이스를 실행하는 것입니다. – amalloy