【问题标题】:clojure - slurping files relative to projectclojure - 与项目相关的文件
【发布时间】:2017-11-15 22:45:21
【问题描述】:

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

与这些 clj 文件一起保存的还有文本文件,我想从它们旁边的 clj 文件中slurp。我的理解是读取文件是相对于工作目录的,并且工作目录将位于您启动 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 运行的任何位置访问文件(如我所料)。现在设置项目后,无论从何处启动 REPL,它们似乎都只能相对于 root 访问。

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

【问题讨论】:

    标签: clojure slurp


    【解决方案1】:

    我相信 Leiningen REPL 使用项目根目录作为他们的工作目录。 (如果不是蹦床,他们会使用带有预期工作目录的子进程——在lein repl 之后尝试jps -l,你应该会看到两个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"))
    

    【讨论】:

    • 感谢您的回复 - 这重申了我的怀疑(REPL 是相对于 root 而言的),但并没有真正告诉我如果您从 root 以外的其他地方启动它,为什么会出现这种情况。我很欣赏使用资源文件夹的提示 - 我很好奇,除了约定之外还有什么优势?我试图搜索文档,但围绕资源/类路径相对路径的讨论有点稀缺。再次感谢。
    • 不确定您是在问这是如何实现的,或者为什么要以这种方式设计。如果是前者,REPL 拥有自己的 JVM 进程,因此 Leiningen 只需在正确的目录中启动这些 JVM。在 leiningen-core 子项目 (leiningen.core.eval) 中有一个专门用于设置此类内容的命名空间。如果是后者,我可能猜想这是为了确保您的 Leiningen 命令的效果是一致的,无论您的 shell 当前工作目录有任何意外(只要它留在项目中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多