Clojure 试图理解隐式Leiningen源路径/命名空间设置假设
(对不起,这太长了。排除误解太长了,不是因为我想让你知道我的问题应该是什么。) 我了解Clojure名称空间的基本知识,并且我的Clojure 试图理解隐式Leiningen源路径/命名空间设置假设,clojure,leiningen,Clojure,Leiningen,(对不起,这太长了。排除误解太长了,不是因为我想让你知道我的问题应该是什么。) 我了解Clojure名称空间的基本知识,并且我的ns语句中列出的文件开头的名称空间必须与目录层次结构中的文件位置相匹配。我已经了解了Leiningen自动设置搜索加载的部分内容,以及它自动加载的部分内容,但是。。。这仍然让我发疯。问题在于,有些东西似乎是莱宁根暗中设定的,在和等明显的地方也没有很好的记录。(可能信息在那里,但我还没有找到/解释。) 我已经做了一些设置,以便在执行lein repl时加载主要源文件(下面
ns
语句中列出的文件开头的名称空间必须与目录层次结构中的文件位置相匹配。我已经了解了Leiningen自动设置搜索加载的部分内容,以及它自动加载的部分内容,但是。。。这仍然让我发疯。问题在于,有些东西似乎是莱宁根暗中设定的,在和等明显的地方也没有很好的记录。(可能信息在那里,但我还没有找到/解释。)
我已经做了一些设置,以便在执行lein repl
时加载主要源文件(下面是popco.clj和acme.clj),但加载其他文件会带来麻烦。我想让MWE尽可能少,问题简短,但我想明确指出,我不是在问已经回答过的更简单的问题(例如)
这里是源文件的位置,右侧列出了来自相同文件的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
,更重要的是,我希望能够要求
或使用其他源文件中的这些源文件。例如,如何从acme.clj内部引用general.clj中的函数?我认为答案可能是在project.clj中的:source path
之后的序列中添加条目,但我不知道应该添加什么
请随意推荐任何东西。其他目录结构,对project.clj的根本更改,等等。关于您的project结构和project.clj的一切看起来都很正常
- 如果我想加载src/utils/general.clj:
这几乎总是通过require
或use
表达式来实现。虽然可以使用load file
加载文件,但这需要您指定文件的路径(相对于启动JVM的位置)<代码>加载
相对于类路径加载它,但实际上,当加载的文件是项目的一部分时,几乎从不使用这些路径。在这种情况下,您可以简单地要求它们
我希望能够从其他源文件中要求或使用这些源文件:
这样做的预期方法是在要使用该名称空间中函数的名称空间顶部放置一个ns形式的(:require[popco.core.acme:as acme])
语句
如何从acme内部引用general.clj中的函数。clj:
(ns popco.core.acme
(:require[utils.general:将[function1-function2]:引用为general))
我认为答案可能是在project.clj:
你很可能永远不需要把任何东西放在那里。require
和use
是合适的工具。他们已经能够找到/src/下的所有文件,因为当leiningen启动java时,这些文件将在类路径中。你可以看到lein classpath
函数使用的类路径
ps:您还可以调用require
和use
作为函数(例如,从REPL表单),但通常最好使用ns格式。例如,我假设load
可以找到源文件,当且仅当use
或require
可以:我假设use
或require
general.clj不起作用。我不知道该尝试什么。当然,你是对的urse:只需使用或要求加载命名空间就行了。加载的行为对我来说仍然很神秘,但是加载文件就足够了。(对于我的项目,从REPL加载文件通常非常有用。)lein classpath
:我不知道。非常有用。谢谢。使用load的一个提示:load和load file的返回值是文件中的最后一个表单。当我在启动时使用load file读取配置文件时,通常每个文件放一个表单。