对于库的开发,我从一个 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文件添加一些内容?
为了使用库,您必须加载代码 - 它位于类路径上是不够的。
当然,您可以在文件中的ns
声明中轻松执行此操作,但是在 repl 中,使用起来会更容易(require '[my-lib.whatever :as w])
之后可以按预期调用(w/foo)
(w/bar)
等。您也可以使用 (in-ns 'my-lib.whatever)
来切换到命名空间,但这不会给您带来好的结果,除非您以前使用过 require
或 use
或 load-file
等来首先获取定义。
假设您创建了一个名为 clj-foo
的新库。
% lein new clj-foo
开始您的回复。
% cd clj-foo
% lein repl
在 repl 中,将主入口点加载到库并切换到其命名空间。
(load-file "src/clj_foo/core.clj")
(ns clj-foo.core)
现在你位于 clj-foo.core
命名空间中,请确保重新添加到 repl ns 中,以获取可用doc
等内容。
(use 'clojure.repl)
就是这样。 你已准备好开始调用库中的函数。 请注意,如果其他库文件是通过 clj_foo/core.clj
顶部的命名空间声明加载的,则可从 clj-foo.core
命名空间获得这些文件。 如果没有,那么您还需要使用其路径调用load-file
。
如果在 core.clj
中进行更改。 您可以再次调用load-file
来获取新代码。 随着您的进步,您可以使用苹果酒来促进单个函数和文件的加载。 但这是另一个问题。 :)
您需要添加依赖项才能使用其他项目中的库。为此,将一个向量(元组-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
前面加上单引号。请注意,某个路径与您的库名称不同。
与其使用lein repl
不如使用 figwheel repl - 如果您的项目是使用 figwheel 设置的。我的库只有一个入口点,那就是lein figwheel devcards
。在那之后,我去命名空间并尝试一个函数没有问题:
cljs.user=> (in-ns 'default-db-format.core)
nil
default-db-format.core=> (check 1 2)
正如 noisesmith 提到的,在 IDE 中使用 REPL 是最好的设置。无需繁琐的键入,只需单击按钮(或击键(即可调出预配置的 REPL(每个命名空间(。无花果/草书设置说明在这里。
我在以下配置中也面临同样的问题:
Leiningen 2.9.0 on Java 1.8.0_201 Java HotSpot(TM) 64-Bit Server VM
我的文件看起来像这样,从 repl 中我希望调用 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=>