Clojure 如何在另一个文件中使用项目中的一个文件?
简单的问题。我是新来Clojure的 如何在另一个文件中使用项目中的一个文件?基本上,我如何包含、导入或要求另一个文件?不是从库中而是从我自己的代码中 谢谢,Clojure 如何在另一个文件中使用项目中的一个文件?,clojure,Clojure,简单的问题。我是新来Clojure的 如何在另一个文件中使用项目中的一个文件?基本上,我如何包含、导入或要求另一个文件?不是从库中而是从我自己的代码中 谢谢, Alex通常,您希望使用与库代码相同的方法,即使用/要求您的命名空间(通过文件顶部的ns表单,有时通过REPL的使用/要求函数)。要使其工作,必须确保它们位于类路径上。这方面的简短指南: 遵循通常的Clojure项目结构:一个包含所有源文件的src/目录,其中filesrc/foo/bar/baz.clj定义了一个名为foo.bar.ba
Alex通常,您希望使用与库代码相同的方法,即
使用/要求您的命名空间(通过文件顶部的ns
表单,有时通过REPL的使用/要求函数)。要使其工作,必须确保它们位于类路径上。这方面的简短指南:
遵循通常的Clojure项目结构:一个包含所有源文件的src/
目录,其中filesrc/foo/bar/baz.clj
定义了一个名为foo.bar.baz
的命名空间。请注意,必须维护目录结构/命名空间名称结构对应关系;否则事情就不会成功。还请注意,不得在命名空间名称中使用
字符或在文件名中使用-
字符(连字符),并且每当在文件名中使用
时,必须在命名空间名称中使用-
(反之亦然),对于Maven项目,目录层次结构会稍微复杂一些,但是现在不要担心这一点(除非您已经是Maven的熟练用户,在这种情况下,这对您来说不是问题)
请参阅前面关于Clojure的Java类路径处理的SO问题,以获得关于文件系统层次结构/类路径层次结构对应关系的更详细的逐步解释
如果来自foo.bar
命名空间的代码需要使用来自foo.qux.baz
命名空间的代码,请执行类似(ns foo.bar(:require[foo.qux.baz:as baz])
的操作,并在foo/bar.clj
中调用来自baz
的函数作为baz/某些函数。或者您可以将(:use foo.quox.baz)
放在ns
表单中,直接调用它们(不带名称空间限定符,例如某些函数
)。这与您对库代码所做的操作完全相同
<强>当使用来自RePL的项目代码时,确保在CasSpATH中包含<代码> SRC/< /COD>目录(目录本身,而不是其中的任何文件)。< /强>您应该考虑使用一些工具来自动为您提供RePL安装(包括类路径管理);Clojure非常受Clojure人的欢迎,也有将Maven与Clojure一起使用的插件
警告:您的JVM启动命令可能(事实上,可能会)识别名为$CLASSPATH
的环境变量。至于它与你的Clojure项目的关系,基本上应该没有。更有可能的是,您的项目将需要不同的类路径,其中一些可能使用与其他项目所需版本不兼容的某些JAR版本(特别是如果您对某些项目使用Clojure 1.1(最新的稳定版本),而对其他项目使用1.2快照)。因此,管理类路径的正确方法是为每个项目准备一个最小版本,并将其传递给JVM启动命令。正如前面提到的,您应该花一些时间学习使用一个好的工具(如上面提到的Leiningen)尽快为您设置类路径,这样您就不需要自己关心这个问题了
(作为旁注,在某些情况下,您可能需要向类路径添加的不仅仅是src/
目录和jar
s,例如,如果您计划调用compile
来生成.class
文件,您还必须将目标目录放在类路径上。不过,这超出了这个问题的范围。)
顺便说一句,我用“正常”这个词开始回答这个问题,因为您也可以在ns
中使用load
&之类的方法将单个名称空间拆分为多个文件。不过,大多数情况下,这并不是您真正想要做的;只需使用经过深思熟虑的名称空间布局即可。您还可以提到有关类路径的内容,我认为这是r新用户。@Brian:谢谢你的建议!我花了一段时间才意识到你指的是$CLASSPATH
-环境变量(你是,不是?:-),但我已经编辑了答案,以包含一些关于它的信息(在我做时添加了一些不相关的位)。