【问题标题】:Error when sharing namespace among files using (in-ns)使用 (in-ns) 在文件之间共享命名空间时出错
【发布时间】:2020-04-13 16:07:37
【问题描述】:

我在所有环路由之间共享一个命名空间,以便将每个路由保存在自己的文件中,所以我有一个文件 routes/core.clj,其中包含:

(ns test-proxy.routes.core)
;; Some utility functions

然后我像这样启动每个路由处理程序文件:

(in-ns 'test-proxy.routes.core)
;; rest of the code

当我启动服务器时,它运行良好。

但是当我更改任何文件并在浏览器中重新加载页面时,我收到以下错误:

Caused by: java.lang.Exception: Found lib name 'test-proxy.routes.core' 
containing period with prefix 'quote'.  lib names inside prefix lists 
must not contain periods

如果我手动重新启动服务器 (lein ring server),一切都会再次按预期工作,但是一旦我在代码库中进行另一次更改,它就会失败并出现同样的错误。它看起来肯定与我使用命名空间的方式有关,但让我感到的是,当我重新启动服务器时它可以正常工作。

如果我像错误提示的那样将命名空间取消引用到(in-ns test-proxy.routes.core),则服务器甚至不会启动:

Syntax error (ClassNotFoundException) compiling at (diplomat/routes/docs.clj:1:1).
test-proxy.routes.core

【问题讨论】:

    标签: clojure namespaces ring


    【解决方案1】:

    in-ns 仅用于 REPL。

    可以按照您想要的任何方式划分您的功能。当您从任何其他命名空间引用函数时,只需使用完全限定名称,如 some.ns.of.mine/my-fn

    当然,您始终可以使用如下命名空间别名:

    (ns some.other.ns.of.mine 
      (:require [some.ns.of.mine :as snom]))   ; define namespace alias
    
    ....
    
      (snom/my-fn ...)   ; invoke the fn
    

    请务必查看How to ns

    【讨论】:

    • 我想在这里对您的论文提出质疑:in-ns 被某些库用于正是出于此目的,将命名空间拆分为多个文件。当然,最值得注意的是 clojure.core 本身,但我们知道这不是用户代码可以遵循的一个很好的示例。我同意这是一个坏主意,因为这个问题试图做,但我不会说ns 不适合它,因为这是它的第一次使用!
    • 感谢您的链接,@alan-thompson 我会阅读的。但即使使用起来不习惯,在程序执行时也能很好地工作。 (我相信)当lein-ring 导致自动重新加载时,它会抛出该错误......我不明白为什么。
    • 当您使用in-ns 时,您实际上是在谎报文件中的命名空间。因此,lein-ring 的自动重新加载功能会变得混乱,然后您会遇到错误。所以,不要那样做!
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多