(对不起,说得太长了。排除误解很长,不是因为我想让你弄清楚我的问题应该是什么。)
我了解 Clojure 命名空间的基础知识,并且在文件开头的 ns
语句中列出的命名空间必须与目录层次结构中的文件位置相匹配。我已经弄清楚了 Leiningen 自动设置搜索 load
的部分内容,以及它自动加载的部分内容,但是......它仍然让我发疯。问题是,Leiningen 似乎隐式设置了一些东西,在 Leiningen tutorial 和 sample project file 等明显的地方也没有很好的记录。 (也许信息在那里,但我还没有找到/解释它。)
我已经设置好了,所以当我执行 lein repl
时,会加载主要的源文件(下面的 popco.clj 和 acme.clj),但是加载其他文件会导致麻烦。我想让 MWE 尽可能地小,问题也很简短,但我想明确表示我不是在问已经回答过的更简单的问题(例如 this one )。
这是源文件所在的位置,右侧列出了来自相同文件的 ns
语句:
src/popco/sims/sim1/sim1propns.clj (ns popco.sims.sim1.sim1propns)
src/utils/general.clj (ns utils.general)
src/popco/core/acme.clj (ns popco.core.acme)
src/popco/core/popco.clj (ns popco.core.popco
[:use popco.core.acme]
[:import [popco.core.acme Propn Obj]]
(:gen-class)) ; not sure what this does yet
这是 project.clj 文件:
(defproject popco-x "0.0.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.5.1"]]
:main popco.core.popco
:profiles {:dev {:dependencies []
:source-paths ["src"] }})
当我运行
lein repl
时,我看到我在 popco.core.popco
命名空间中:popco.core.popco=>
我发现 acme.clj 中定义的函数和记录类型都可用。我已经(通过反复试验)了解到,project.clj 中的“
:main popco.core.popco
”导致 popco.clj 运行,这导致 REPL 留在 popco.core.popco
命名空间中。到现在为止还挺好。以下是我的问题:
如果我想加载 src/utils/general.clj 或 src/popco/sims/sim1/sim1propns.clj 怎么办?我可以使用
load-file
加载它们,但我想在 REPL 中使用 load
,更重要的是,我希望能够从其他源文件中对这些源文件进行 require
或 use
。例如,如何从 acme.clj 内部引用 general.clj 中的函数?我认为答案可能是在 project.clj 中的 :source-paths
之后向序列添加条目,但我对应该去那里的内容感到困惑。随意推荐任何东西。其他目录结构,对 project.clj 的彻底更改,等等。
最佳答案
关于您的项目结构和 project.clj 的一切看起来完全正常。
这几乎总是通过
require
或 use
表达式完成。虽然可以使用 load-file
加载文件,但这需要您指定文件的路径(相对于您启动 JVM 的位置)。 load
相对于类路径加载它,但实际上当加载的文件是项目的一部分时,这些几乎从未使用过。在这种情况下,您可以简单地对它们进行 require
。 这样做的预期方法是将 ns 形式的
(:require [popco.core.acme :as acme])
语句放在要使用该命名空间中的函数的命名空间顶部。 (ns popco.core.acme
(:require [utils.general :refer [function1 function2] :as general))
你很可能永远不需要在那里放任何东西。
require
和 use
是合适的工具。他们已经能够在/src/下找到所有文件,因为当 leiningen 启动 java 时,这些文件将在类路径中。您可以看到与 lein classpath
函数一起使用的类路径。 ps:您也可以将
require
和 use
作为函数调用(例如形成 REPL),但通常首选以 ns 形式执行此操作。关于clojure - 试图理解隐式 Leiningen 源路径/命名空间设置假设,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19737691/