clojure - 相对于项目的slurping文件

时间:2017-06-14 00:41:04

标签: clojure slurp

我有一个使用leningen创建的项目,其中我已经在src / some_project_name目录中保存了clj文件(以及自动生成的core.clj文件)。

同样保存这些clj文件的是我希望从他们住在旁边的clj文件中slurp的文本文件。我的理解是,读取文件是相对于工作目录的,并且工作目录将位于您启动REPL的任何位置。我从src / some_project_name里面启动了REPL,其中所有文件都位于,而不是root。 (System/getProperty "user.dir")确认这是活动目录。

但是我还读到slurp会查找相对于你的根目录的文件,尽管从src / some_project_name中启动了REPL,但显然正在发生这种情况。我必须列出相对于根目录的文本文件路径,以便找到它们,例如, " SRC / some_project_name / foo.txt的"而不只是" foo.txt"。

在设置项目之前,可以相对于REPL运行的任何地方访问文件(正如我所期望的那样)。现在,在设置项目之后,无论REPL在何处启动,它们似乎只能相对于root进行访问。

我对此没有任何问题,但我不明白。是否有一些设置由leningen完成,它拦截REPL评估并告诉它从root搜索而不是在活动目录的位置搜索?

1 个答案:

答案 0 :(得分:7)

我相信Leiningen REPL使用项目root作为他们的工作目录。 (如果没有蹦床,他们使用带有预期工作目录的子流程 - 在jps -l后尝试lein repl,您应该会看到两个clojure.main进程。)

另外,您可能希望使用clojure.java.io/resource使用类路径相对路径加载文件。这些文件通常放在resources文件夹中 - 与Leiningen一起,这通常是src的兄弟。

例如,如果您将foo.txt放在resources/some_project_name中,则应该可以执行以下操作:

(require '[clojure.java.io :as io])

(slurp (io/resource "some_project_name/foo.txt"))