如何在另一个文件中使用项目中的一个文件?

时间:2010-03-17 01:44:20

标签: clojure

简单的问题。我是Clojure的新手。

如何在另一个文件中使用项目中的一个文件?基本上我如何包含,导入或需要其他文件?不是来自图书馆,而是来自我自己的代码。

谢谢, 亚历

1 个答案:

答案 0 :(得分:24)

通常,您需要使用与库代码相同的方法,即use / require您的命名空间(通过顶部的ns表单文件,有时是REPL的use / require函数。为此,您必须确保它们位于类路径中。简短指南:

  1. 遵循通常的Clojure项目结构:包含所有源文件的src/目录,其中file src/foo/bar/baz.clj定义名为foo.bar.baz的命名空间。请注意,您必须维护目录结构/命名空间名称结构的对应关系;事情不会起作用。另请注意,不得使用命名空间名称中的_字符或文件名中的-字符(连字符)以及在文件名中使用_时必须在命名空间名称中使用-(反之亦然。)最后,目录层次结构对于Maven项目会稍微复杂一些,但现在不要担心这个问题(除非你已经熟练了) Maven的用户,在这种情况下,这对你来说不是问题。)

    另请参阅this answer of mine以前有关使用Clojure处理Java类路径的SO问题,以获得有关文件系统层次结构/类路径层次结构对应关系的更详细的逐步说明。

  2. 如果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)。这与你为图书馆代码所做的完全相同。

  3. 在使用REPL中的项目代码时,请确保在类路径中包含src/目录(目录本身,而不是其中的任何文件)。您可能应该考虑使用一些工具为您自动化REPL设置(包括类路径管理); Leiningen非常受Clojurians的欢迎,也有使用Maven和Clojure的插件。

    警告:您的JVM启动命令可能(实际上可能会)识别名为$CLASSPATH的环境变量。至于它与你的Clojure项目的关系,基本上应该没有。更有可能的是,你的项目每个都需要一个不同的类路径,有些可能使用某些罐子的版本与其他人不同的版本(特别是如果你使用Clojure 1.1 - 最新的稳定版本 - 对于某些项目,同时进行实验与其他人一起拍摄1.2张快照)。因此,管理类路径的正确方法是为每个项目准备一个最小版本,并将其传递给JVM启动命令。如前所述,你应该花一些时间学习使用一个好工具(比如上面提到的Leiningen)来尽快为你设置类路径,这样你就不需要自己关心了。

    (作为旁注,在某些情况下,您可能不得不在类路径中添加src/目录和jar以外的内容,例如,如果您打算调用compile要生成.class文件,你必须将目标目录放在类路径上。但这超出了这个问题的范围。)

    顺便说一句,我已经用“正常”这个词开始了这个答案,因为你也可以使用像load& in-ns将单个名称空间拆分为多个文件。但大多数情况下,这并不是你真正想做的事情。只需使用经过深思熟虑的命名空间布局。