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

13

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

我如何在一个文件中使用我的项目中的另一个文件?基本上,我如何包含、导入或要求另一个文件?不是来自库,而是来自我的自己的代码。

谢谢, Alex

1个回答

26
通常您会想要使用与库代码相同的方法,即通过文件顶部的ns表单并有时在REPL中使用use / require函数,来use / require您的命名空间。为使其起作用,必须确保它们在类路径上。以下是一个简短的指南:
  1. 按照通常的Clojure项目结构:包含所有源文件的src/目录,在这里文件src/foo/bar/baz.clj定义了名为foo.bar.baz的命名空间。请注意,您必须维护目录结构/命名空间名称结构对应关系;否则将无法正常工作。还要注意不得在命名空间名称中使用_字符或在文件名中使用-字符(连字符),并且每当您在文件名中使用_时,必须在命名空间名称中使用-(反之亦然)。最后,Maven项目的目录层次结构将略微复杂,但现在不用担心这个问题(除非您已经是熟练的Maven用户,在这种情况下,这对您来说将不是问题)。

    还可以查看我之前在Stack Overflow上回答的有关Clojure处理Java类路径的更详细的逐步解释,链接为:这个回答

  2. 如果你的foo.bar命名空间中的代码需要用到foo.quux.baz命名空间中的代码,可以在foo/bar.clj中使用如下代码:(ns foo.bar (:require [foo.quux.baz :as baz])),然后可以通过baz/some-function调用函数。也可以在ns表单中使用(:use foo.quux.baz)直接调用(不需要加上命名空间前缀,例如some-function)。这与处理库代码的方式完全相同。
    当从REPL(交互式编程环境)中处理项目代码时,请确保将src/目录(目录本身,而不是其中的任何文件)包含在类路径中。您应该考虑使用某些工具自动化REPL设置(包括类路径管理);Clojurians非常喜欢Leiningen,并且还有插件可以将Maven与Clojure一起使用。
    警告:您的JVM启动命令可能(实际上很可能)识别一个名为$CLASSPATH的环境变量。关于它与Clojure项目的关系,基本上不应该有任何关系。很可能,每个项目都需要不同的类路径,有些可能使用与其他项目所需的某些JAR文件不兼容的版本(特别是如果您对某些项目使用Clojure 1.1(即最新稳定版本),同时对其他项目使用1.2快照版)。因此,正确管理类路径的方式是为每个项目准备一个最小版本,并将其传递给JVM启动命令。如前所述,您应该投入一些时间学习使用像上述提到的Leiningen这样的好工具,尽快为您设置类路径,这样您就不需要自己关心了。(顺便说一下,在某些情况下,您可能需要添加的内容不仅仅是src/目录和jar文件,例如,如果您计划调用compile来生成.class文件,则还需要将目标目录放在类路径上。这超出了本问题的范围。)BTW,我使用“通常”这个词开始回答,因为您也可以使用像loadin-ns这样的东西将单个名称空间拆分为多个文件。但大多数情况下,这不是您真正想要做的事情;只需使用经过深思熟虑的名称空间布局即可。

1
你也可以提及关于CLASSPATH的一些内容,我认为对于新用户来说这可能是比较令人困惑的部分。 - Brian Carper
@Brian:谢谢建议!我花了一些时间才意识到你指的是 $CLASSPATH 环境变量(你是这个意思吧? :-)),但我已经编辑答案并加入了一些相关信息(顺便加入了一些无关的东西)。 - Michał Marczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接