访问leiningen REPL中的库函数

时间:2016-02-14 00:10:53

标签: clojure clojurescript leiningen

对于库的开发我是从lein项目开始的,如下调用:

lein new mylib

如果我现在调用lein install,我可以在其他项目中访问我的库。但是试图对我写的函数进行不必要的测试失败了:

lein repl
...
(dir mylib.core)
Exception No namespace: mylib.core found  clojure.core/the-ns (core.clj:4008)

我是否必须在project.clj文件中添加一些内容?

4 个答案:

答案 0 :(得分:2)

为了使用库,你必须加载代码 - 它在类路径上是不够的。

您可以在文件的ns声明中轻松完成此操作,但在repl中可以更轻松地使用(require '[my-lib.whatever :as w])之后可以调用(w/foo) {{1正如预期的那样。您也可以使用(w/bar)切换到命名空间,但除非您之前使用过(in-ns 'my-lib.whatever)requireuse等,否则这不会给您带来好结果。首先得到定义。

答案 1 :(得分:0)

您需要添加依赖项才能从其他项目中使用您的库。为此,将向量(元组-2)添加到向量中,该向量是project.clj文件中:dependencies键的值。这是一个例子:

:dependencies [[org.clojure/clojure "1.7.0"]
               [org.clojure/clojurescript "1.7.170"]
               [org.clojure/core.async "0.2.371"]
               [default-db-format "0.1.0-SNAPSHOT"]
               [com.andrewmcveigh/cljs-time "0.3.14"]]

我自己的本地库名为default-db-format。它与为com.andrewmcveigh/cljs-time添加依赖项没有什么不同。

正如您所说,您已经可以做到这一点,但无法获得与库本身项目的REPL连接。当您转到(in-ns 'some-path)时,您需要some-path前面的单引号。请注意, some-path 与您的库名称不同。

如果您的项目是使用figwheel设置的,而不是使用lein repl,您可以使用figwheel repl。我的图书馆只有一个入口点,即lein figwheel devcards。之后,我没有问题进入命名空间并尝试一个函数:

cljs.user=> (in-ns 'default-db-format.core)
nil
default-db-format.core=> (check 1 2)

正如noisesmith所说,在IDE中使用REPL是最好的设置。没有繁琐的输入只需单击按钮(或按键)即可调出预先配置的REPL(每个命名空间)。 Figwheel / Cursive设置说明here

答案 2 :(得分:0)

假设您创建了一个名为clj-foo的新库。

% lein new clj-foo

开始你的repl。

% cd clj-foo
% lein repl

在repl中,将主入口点加载到库中并切换到其命名空间。

(load-file "src/clj_foo/core.clj")
(ns clj-foo.core)

现在您位于clj-foo.core命名空间中,请确保在重复版中添加回来以获取doc这样的内容。

(use 'clojure.repl)

就是这样。您已准备好开始调用库中的函数。请注意,如果clj-foo.core名称空间由clj_foo/core.clj顶部的名称空间声明加载,则可以从load-file命名空间中获取。如果没有,那么你也需要用他们的路径调用core.clj

如果您在load-file中进行了更改。您可以再次调用compile group: 'com.google.endpoints', name: 'endpoints-framework', version: '2.0.+' 来获取新代码。随着您的进步,您可以使用苹果酒来方便加载各个功能和文件。但这是另一个问题。 :)

答案 3 :(得分:0)

我还面临着以下配置的相同问题:

Leiningen 2.9.0 on Java 1.8.0_201 Java HotSpot(TM) 64-Bit Server VM

我的文件如下所示,从我想调用foo函数的那个​​

 (ns cljtest.test
  (:gen-class))

(defn foo [input]
  (assoc {} "a" 123)) 

这两种方法对我来说都很好。

1)切换到适当的名称空间:

cljtest.core=> (in-ns 'cljtest.test)
#object[clojure.lang.Namespace 0x90175dd "cljtest.test"]
cljtest.test=> (foo nil)
{"a" 123}
cljtest.test=>

2)要求适当的名称空间:

cljtest.core=> (require '[cljtest.test :as test])
nil
cljtest.core=> (test/foo nil)
{"a" 123}
cljtest.core=>