对于库的开发我是从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文件中添加一些内容?
答案 0 :(得分:2)
为了使用库,你必须加载代码 - 它在类路径上是不够的。
您可以在文件的ns
声明中轻松完成此操作,但在repl中可以更轻松地使用(require '[my-lib.whatever :as w])
之后可以调用(w/foo)
{{1正如预期的那样。您也可以使用(w/bar)
切换到命名空间,但除非您之前使用过(in-ns 'my-lib.whatever)
或require
或use
等,否则这不会给您带来好结果。首先得到定义。
答案 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=>