简单的问题。我是Clojure的新手。
如何在另一个文件中使用项目中的一个文件?基本上我如何包含,导入或需要其他文件?不是来自图书馆,而是来自我自己的代码。
谢谢, 亚历
答案 0 :(得分:24)
通常,您需要使用与库代码相同的方法,即use
/ require
您的命名空间(通过顶部的ns
表单文件,有时是REPL的use
/ require
函数。为此,您必须确保它们位于类路径中。简短指南:
遵循通常的Clojure项目结构:包含所有源文件的src/
目录,其中file src/foo/bar/baz.clj
定义名为foo.bar.baz
的命名空间。请注意,您必须维护目录结构/命名空间名称结构的对应关系;事情不会起作用。另请注意,不得使用命名空间名称中的_
字符或文件名中的-
字符(连字符)以及在文件名中使用_
时必须在命名空间名称中使用-
(反之亦然。)最后,目录层次结构对于Maven项目会稍微复杂一些,但现在不要担心这个问题(除非你已经熟练了) Maven的用户,在这种情况下,这对你来说不是问题。)
另请参阅this answer of mine以前有关使用Clojure处理Java类路径的SO问题,以获得有关文件系统层次结构/类路径层次结构对应关系的更详细的逐步说明。
如果foo.bar
命名空间中的代码需要使用foo.quux.baz
命名空间中的代码,请在(ns foo.bar (:require [foo.quux.baz :as baz]))
中执行foo/bar.clj
之类的操作,并从{{baz
调用函数1}}为baz/some-function
。或者您可以将(:use foo.quux.baz)
放在ns
表单中,而不是直接调用它们(没有名称空间限定符,例如some-function
)。这与你为图书馆代码所做的完全相同。
在使用REPL中的项目代码时,请确保在类路径中包含src/
目录(目录本身,而不是其中的任何文件)。您可能应该考虑使用一些工具为您自动化REPL设置(包括类路径管理); Leiningen非常受Clojurians的欢迎,也有使用Maven和Clojure的插件。
警告:您的JVM启动命令可能(实际上可能会)识别名为$CLASSPATH
的环境变量。至于它与你的Clojure项目的关系,基本上应该没有。更有可能的是,你的项目每个都需要一个不同的类路径,有些可能使用某些罐子的版本与其他人不同的版本(特别是如果你使用Clojure 1.1 - 最新的稳定版本 - 对于某些项目,同时进行实验与其他人一起拍摄1.2张快照)。因此,管理类路径的正确方法是为每个项目准备一个最小版本,并将其传递给JVM启动命令。如前所述,你应该花一些时间学习使用一个好工具(比如上面提到的Leiningen)来尽快为你设置类路径,这样你就不需要自己关心了。
(作为旁注,在某些情况下,您可能不得不在类路径中添加src/
目录和jar
以外的内容,例如,如果您打算调用compile
要生成.class
文件,你必须将目标目录放在类路径上。但这超出了这个问题的范围。)
load
& in-ns
将单个名称空间拆分为多个文件。但大多数情况下,这并不是你真正想做的事情。只需使用经过深思熟虑的命名空间布局。