clojure - 相对于项目的slurping文件

Sol*_*xun 4 slurp clojure

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

与这些clj文件一起保存的是我想要slurp从它们旁边的clj文件中获取的文本文件.我的理解是,读取文件是相对于工作目录的,并且工作目录将位于您启动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搜索而不是在活动目录的位置搜索?

Mic*_*zyk 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"))
Run Code Online (Sandbox Code Playgroud)