2017-06-14 74 views
3

我使用leningen在我已经在src/some_project_name目录保存CLJ文件(旁边的自动生成core.clj文件)创建的项目。的Clojure - 啜文件相对于项目

还保存这些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正在运行(如我所期望的)访问。现在建立一个项目后,它们似乎只能相对于root进行访问,而不管REPL的起始位置。

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

回答

5

我相信Leiningen REPLs使用项目的根目录作为其工作目录。 (如果没有trampolined,他们使用一个子进程与预期的工作目录 - 尝试jps -l一个lein repl后,你会看到两个clojure.main过程)

在一个单独的说明,您可能需要使用clojure.java.io/resource加载使用classpath-文件相对路径。这些文件通常会放在resources文件夹中 - 与Leiningen一起,这通常是src的兄弟。

例如,如果你把foo.txtresources/some_project_name,你应该能够做到以下几点:

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

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

感谢您的答复 - 这重申我怀疑(REPL是相对于根),但不真的告诉我为什么如果你从根以外的地方开始它的原因。我很欣赏关于使用资源文件夹的提示 - 我很好奇,除常规之外,还有哪些优势?我试图扫描文档,但围绕资源/类路径相对路径的讨论有点稀缺。再次感谢。 – Solaxun

+0

不确定您是在问这是如何实现的,或者为什么这样设计。如果前者,REPL获得他们自己的JVM进程,那么Leiningen只需要在正确的目录中启动这些JVM。有一个名称空间专门用于在leiningen-core子项目('leiningen.core.eval')中设置这些内容。如果是后者,我可能会推测这是为了确保您的Leiningen命令的效果是一致的,无论您的shell的当前工作目录有任何意外(只要它停留在项目中)。 –

相关问题