clojure - 获取与项目相关的文件

标签 clojure slurp

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

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

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

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

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

最佳答案

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

另外,您可能需要使用 clojure.java.io/resource使用类路径相对路径加载文件。此类文件通常会放置在 resources 中文件夹 – 对于 Leiningen,这通常是 src 的同级文件夹.

例如,如果您放置 foo.txtresources/some_project_name ,您应该能够执行以下操作:

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

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

关于clojure - 获取与项目相关的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44533630/

相关文章:

string - 在 Perl 中,如何将整个文件读入字符串?

perl - 为什么我可以通过将尖括号的结果分配给输入记录分隔符来处理文件?

macros - 可以放心地忽略宏和内置宏之间的区别吗?

api - 使用 Clojure 发出多个 API 请求的功能方法

events - 拉米纳 vs Storm

Clojure:动态构造基于变量的函数?

postgresql - 使用 Korma 运行原始 sql 时如何在准备好的语句中传递 clojure 向量?

python - 在 python 中解析 groovy 文件