【问题标题】:Is there any way to force Clojure to map a parent namespace path to a certain directory?有什么方法可以强制 Clojure 将父命名空间路径映射到某个目录?
【发布时间】:2017-02-10 21:22:46
【问题描述】:

我喜欢 boot 让我可以将所有源文件放在当前目录中。但是,我仍然想开发引用父命名空间的代码,以便更容易导入到其他项目中。例如,我想让我所有的命名空间都以相同的前缀开头,但它们的源文件仍然驻留在当前目录中,如下所示:

(ns polysyndeton.conjunctions ...)  ; in ./conjunctions.clj

(ns polysyndeton.disjunctions ...)  ; in ./disjunctions.clj

(ns polysyndeton.util ...)          ; in ./util.clj

我如何告诉 boot 或 Clojure 任何以 polysyndeton. 开头的命名空间都应该在当前目录中找到?

【问题讨论】:

    标签: clojure namespaces


    【解决方案1】:

    我认为不可能(没有不推荐的解决方法)。 Clojure 使用与命名空间段对应的目录结构来查找类路径上的源文件。所以你必须坚持这个结构。 另见:What are common conventions for using namespaces in Clojure?

    【讨论】:

    • 呃哦,听起来好像没有办法。不过,我想知道 Clojure 是否在某个地方提供了一个钩子,因为 leiningen 和 boot 能够将目录结构的根放在不同的位置。他们是怎么做到的?
    • 一种解决方法(而不是使用符号链接)是使用load-file 从相对或绝对文件路径显式加载文件。
    • 您可以通过修改类路径来更改根目录,但不能颠覆 Clojure 将命名空间映射到类路径相对路径的方式。
    • @MichielBorken 谢谢—load-file 确实可以加载文件。不过,它似乎不适用于 boot test,,因为 boot 需要自行搜索和加载文件。
    【解决方案2】:

    您可以使用符号链接轻松实现此目的。请注意,这会将polysyndeton.polysyndeton.polysyndeton.{...}.util 之类的任何字符串映射到文件util.clj

    ln -s . polysyndeton
    

    【讨论】:

    • 我喜欢这个主意,但是在ls -s . polysyndeton 之后,boot 给了我这个错误:java.nio.file.FileSystemLoopException: polysyndeton/polysyndeton。我认为这是因为 boot 和/或 JVM 正在递归搜索 polysyndeton 目录。我将:source-paths 设置为#{"polysyndeton"}。 (#{"."} 的类似错误。)有没有办法将源文件的搜索限制在单一深度(只搜索给定目录,而不是其子目录)?
    • 我不知道。但是为什么要将源路径设置为polysyndeton?这不就是为了让你不必那样做吗?如果我做一个这样的符号链接并需要一个命名空间,它对我来说很好。
    • :source-paths 设置为#{"polysyndeton"} 是我的第二次尝试。当:source-paths#{"."} 时,我得到同样的错误。你能跑boot test吗?
    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多