我有一个使用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搜索而不是在活动目录的位置搜索?
答案 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"))