簡體   English   中英

Lein用協議編譯項目

[英]Lein compile project with protocols

我有一個以下ns項目:

  • Processor.bus <-總線操作的通用協議
  • Processor.core <-要運行的主類
  • Processor.pubsub <-具體的總線方法

在processor.pubsub中,我有以下內容:

(ns processor.pubsub
  (:gen-class))

(defrecord PubsubBus [client])

; + other stuff related to this implementation

在processor.bus中,我有:

(ns tiptop.processor.bus
  (:gen-class)
  (:import [processor.pubsub PubsubBus]))

(defprotocol SendToBus
  (send-line! [self json]))

(extend-type PubsubBus
  SendToBus
  ....) 

Lein不能按正確的順序編譯名稱空間的問題。 我收到以下錯誤:

$ lein compile
Compiling user
Compiling processor.auth
Compiling processor.bus
java.lang.ClassNotFoundException: processor.pubsub.PubsubBus, compiling:(bus.clj:1:1)
Exception in thread "main" java.lang.ClassNotFoundException: processor.pubsub.PubsubBus, compiling:(bus.clj:1:1)

注意,它會嘗試按照字母順序(auth-> bus-> pubsub)而不是依賴關系順序來編譯我的ns。

當然我可以預先編譯pubsub.clj,例如:

$ lein compile processor.pubsub
$ lein compile processor.bus
$ lein compile

但這對我來說似乎並不正確。 如果我會有更多這樣的依賴命名空間怎么辦?

我如何才能告訴Lein應該以什么順序編譯我的名稱空間? 或者,也許我缺少在project.clj進行配置的內容? 我有:aot :all如果重要的話

Leiningen不會做任何事情來確定名稱空間的依賴性,它只是編譯您告訴它的名稱空間。 Clojure編譯器通過require (和過時的use )內置函數處理名稱空間依賴項。

在這種情況下,您需要:require定義所生成類的名稱空間,然后才能將其導入。 否則,您將依賴於導入在類路徑上的類,這是其他操作的副作用(在REPL中加載定義它的名稱空間,之前的lein compile命令等)。 在名稱空間定義中添加顯式的:require可以確保在導入類之前就定義了該類:

(ns processor.bus
  (:gen-class)
  (:require [processor.pubsub])
  (:import [processor.pubsub PubsubBus]))

其他一些注意事項:

  • 我懷疑:gen-class在這些命名空間聲明中正在做您認為正在做的事情。 它不會導致為這些命名空間中定義的協議和記錄編寫類文件; 這就是:aot project.clj:aot密鑰的作用。 在這里使用的:gen-class標志將導致生成名為processor.busprocessor.pubsub類。
  • 在定義協議的同一名稱空間中,通過extend-type指定的具體記錄類型會看到協議實現詳細信息,這很不尋常。 extend-type的典型用例是擴展協議以使其使用超出您控制范圍的類型,例如Clojure內置或第三方庫中定義的類型。 當協議和記錄在同一項目中定義時,通常將協議實現內聯定義為defrecord主體的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM