8

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

与这些 clj 文件一起保存的还有我想slurp从它们旁边的 clj 文件中提取的文本文件。我的理解是读取文件是相对于工作目录的,并且工作目录将位于您启动 REPL 的任何位置。我从所有文件所在的 src/some_project_name 内部而不是 root 启动 REPL。(System/getProperty "user.dir")确认这是活动目录。

但是,我也读过slurp它将查找与您的根目录相关的文件,尽管从 src/some_project_name 中启动 REPL,这显然是正在发生的事情。我必须列出相对于根目录的文本文件路径才能找到它们,例如“src/some_project_name/foo.txt”,而不仅仅是“foo.txt”。

在设置项目之前,可以相对于 REPL 运行的任何位置访问文件(如我所料)。现在,在设置项目之后,它们似乎只能相对于 root 访问,而不管 REPL 从何处启动。

我对此没有问题,但我不明白。leningen 是否进行了一些设置来拦截 REPL 评估并告诉它从根目录而不是活动目录的位置进行搜索?

4

1 回答 1

10

我相信 Leiningen REPL 使用项目根目录作为他们的工作目录。(如果不是蹦床,他们会使用一个带有预期工作目录的子进程——jps -l在 a 之后尝试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"))
于 2017-06-14T01:41:14.500 回答