【问题标题】:Lein compile project with protocolsLein 使用协议编译项目
【发布时间】:2016-02-03 15:35:17
【问题描述】:

我有一个带有以下 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

【问题讨论】:

  • 你确定这只是字母顺序吗?您是否尝试过更改命名空间的名称并重新编译?

标签: clojure leiningen


【解决方案1】:

Leiningen 不做任何事情来确定命名空间的依赖关系——它只是编译你告诉它的命名空间。 Clojure 编译器通过 require(和过时的 use)内置函数处理命名空间依赖关系。

在这种情况下,您需要先:require 定义生成的类的命名空间,然后才能导入它。否则,您将依赖类路径中存在的导入类作为某些其他操作的副作用(加载在 REPL 中定义它的命名空间、先前的 lein compile 命令等)。在命名空间定义中添加显式 :require 可确保在导入类之前定义类:

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

其他几点说明:

  • 我怀疑:gen-class 正在做你认为它在这些命名空间声明中所做的事情。它不会导致为这些命名空间中定义的协议和记录编写类文件;这就是 Leiningen project.clj 中的 :aot 键的用途。此处使用的 :gen-class 标志将导致生成名为 processor.busprocessor.pubsub 的类。
  • 在定义协议的同一命名空间中看到通过extend-type 指定的具体记录类型的协议实现细节是不寻常的。 extend-type 的典型用例是扩展您的协议以使用您无法控制的类型,例如 Clojure 中内置的类型或第三方库中定义的类型。当协议和记录在同一个项目中定义时,更常见的是将协议实现内联定义为 defrecord 正文的一部分。

【讨论】:

  • 谢谢!我记得我有类似的以正确顺序编译的依赖项,想知道为什么。现在我知道这是因为除了导入之外还需要
猜你喜欢
  • 2019-11-06
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
相关资源
最近更新 更多