Clojure命名空间不可访问
我试图从库“Spurous aws sdk helper”中加载两个名称空间(按照我在本地安装的方式,这是我在部署到Clojars之前对其进行的测试)。我从Clojure命名空间不可访问,clojure,leiningen,read-eval-print-loop,Clojure,Leiningen,Read Eval Print Loop,我试图从库“Spurous aws sdk helper”中加载两个名称空间(按照我在本地安装的方式,这是我在部署到Clojars之前对其进行的测试)。我从if语句中加载名称空间 加载名称空间后,我调用一个由加载的名称空间之一提供的函数 问题是,当通过leinringserver执行代码时,我收到一个Java异常,通知我尝试访问的名称空间不可用 但是如果我运行leinrepl,然后运行(使用'spushousicclojure example.routes.home)相关的顶级名称空间;然后(需
if
语句中加载名称空间
加载名称空间后,我调用一个由加载的名称空间之一提供的函数
问题是,当通过leinringserver
执行代码时,我收到一个Java异常,通知我尝试访问的名称空间不可用
但是如果我运行leinrepl
,然后运行(使用'spushousicclojure example.routes.home)
相关的顶级名称空间;然后(需要'[spustouse-aws-sdk-helper.core:as core])
名称空间-就像我稍后链接到的代码中演示的那样-然后名称空间将可用,随后对函数的调用不会出错
我不确定这是否是一个误导性的错误,事实上,这不是我试图要求的名称空间,这是问题所在,而是其中的某个问题?但如果这是真的,那么当我在lein repl
中手动调用时,它为什么会工作呢
我指的代码是:
是(core/configure…
调用触发了一个Java异常,表示“core”命名空间不可用。但是从leinrepl
运行以下代码很好
(use 'spurious-clojure-example.routes.home)
(require '[spurious-aws-sdk-helper.core :as core])
(core/configure ...rest of code...)
更新1:
为了澄清,我更新了代码如下
(when (env :debug)
(require '[spurious-aws-sdk-helper.core :as core])
(require '[spurious-aws-sdk-helper.utils :refer [endpoint cred]])
(core/configure
{:s3 "test-bucket7"
:sqs "test-queue9"
:ddb (slurp "./resources/config/schema.yaml")}))
…在REPL中运行时,它工作正常
问题在于通过lein-ring服务器运行它时
我已经开始在这里阅读有关(ns resolve)
的内容:
但它建议的解决方案是:(ns解析'core'配置)
不起作用;它只是抛出了一个无法解析此上下文中的symbol:core
错误。尝试了:
(when true ; also tried with false
(require '[clojure.string :as str])
(str/split "Clojure is awesome!" #" "))
=> No such namespace: str
我也有点惊讶,因为if
和when
应该只计算它们的表达式主体的相应分支,而不涉及其他表达式。我没想到false上会出现名称空间错误
更令人惊讶的是,我并没有料到true上也会出现名称空间错误。我猜,甚至在代码求值之前,java编译就试图解析名称空间。我不知道具体原因
至于你应该做什么,这段代码很时髦,我从来没有想过或见过有人做过类似的事情。除非有特定的原因,否则解决方案很简单:将需求推到
ns
的最顶端。无需更改任何其他内容。我使用lein new compojure app
创建了一个应用程序,当:debug
值为truthy时,需要clojure.string:as str
并将内容打印到shell中
下面的代码通过lein-ring服务器
工作。我用:debug
值true
和false
对它进行了测试。在您的示例中,您使用了environ
,因此,我将{:debug true}
或{:debug false}
放在.lein env
中
(ns integralist.handler
(:require [compojure.core :refer [defroutes routes]]
[ring.middleware.resource :refer [wrap-resource]]
[ring.middleware.file-info :refer [wrap-file-info]]
[hiccup.middleware :refer [wrap-base-url]]
[compojure.handler :as handler]
[compojure.route :as route]
[integralist.routes.home :refer [home-routes]]
[environ.core :refer [env]]))
(when (env :debug)
(require '[clojure.string :as str]))
(when (env :debug)
(defn it-works! []
(println "It works!:" (str/split "Clojure is Awesome" #" "))))
(defn init []
(println "integralist is starting")
(when (env :debug)
(it-works!)))
(defn destroy []
(println "integralist is shutting down"))
(defroutes app-routes
(route/resources "/")
(route/not-found "Not Found"))
(def app
(-> (routes home-routes app-routes)
(handler/site)
(wrap-base-url)))
(ns integralist.handler)
(:require[compojure.core:参考[defroutes]]
[ring.middleware.resource:参考[wrap resource]]
[ring.middleware.file-info:参考[wrap file info]]
[hiccup.middleware:参考[wrap base url]]
[compojure.handler:作为处理程序]
[合成路线:作为路线]
[integralist.routes.home:参考[home routes]]
[环境核心:参考[环境]])
(何时(环境:调试)
(需要“[clojure.string:as str]))
(何时(环境:调试)
(defn它起作用了![]
(println“它有效!”:“(str/split“Clojure真棒”)
(defn init[]
(println“整合器正在启动”)
(何时(环境:调试)
(有效!))
(defn destroy[]
(println“整合器正在关闭”))
(取消路线应用程序路线)
(路线/资源“/)
(路由/未找到“未找到”))
(def应用程序
(->(路线主页路线应用程序路线)
(处理人/现场)
(换行基本url)))
是否确实设置了
~/.lein/profiles.clj
以使(env:debug)
返回true
?请注意,您在内容中使用了cred
。除非<代码>调试< /COD> Profile打开,否则它将不可用。@死鬼非常好的点关于<代码> CRED<代码>,这将是一个单独的问题,我需要考虑之后进行修复(很可能是<代码> UTIL/COD>命名空间,我将显式加载;因为我需要这个功能,不管配置文件如何)。.如果我在expr时将str/split expr放在外部,它就会工作。(do(如果为true,也可以使用false)(要求“[clojure.string:as str]))(str/split“clojure太棒了!”。可能是因为ns解析发生在每个表达式上。@deadghost感谢您的反馈。只是想澄清一下:如果应用程序在生产环境中,我想避免要求使用助手库-即助手库仅用于开发。@deadghost我在问题的底部添加了一个更新,该更新澄清了我所做的一些更改,并试图使用ns resolve
(这不起作用)@Integralist在开发过程中只需要求使用helper库,你会得到什么?@deadghost我认为它会稍微有点性能,或者这只是胡说八道?因为Clojure实际上是一种编译语言(例如编译到可部署的jar中),所以我需要以不同的方式来考虑类似的事情(与Ruby这样的脚本语言相比)。但我仍然认为最好是明确的,让代码强调一个特定的库只在开发中使用,而不是直接加载它而不做任何解释(但这是正确的)
(ns integralist.handler
(:require [compojure.core :refer [defroutes routes]]
[ring.middleware.resource :refer [wrap-resource]]
[ring.middleware.file-info :refer [wrap-file-info]]
[hiccup.middleware :refer [wrap-base-url]]
[compojure.handler :as handler]
[compojure.route :as route]
[integralist.routes.home :refer [home-routes]]
[environ.core :refer [env]]))
(when (env :debug)
(require '[clojure.string :as str]))
(when (env :debug)
(defn it-works! []
(println "It works!:" (str/split "Clojure is Awesome" #" "))))
(defn init []
(println "integralist is starting")
(when (env :debug)
(it-works!)))
(defn destroy []
(println "integralist is shutting down"))
(defroutes app-routes
(route/resources "/")
(route/not-found "Not Found"))
(def app
(-> (routes home-routes app-routes)
(handler/site)
(wrap-base-url)))