我正在尝试从库“spurious-aws-sdk-helper”中加载两个命名空间(顺便说一下,我已经在本地安装了它 - 这是我在部署到Clojars之前进行测试)。我在if
语句内加载命名空间。
一旦命名空间被加载,我调用一个由其中一个已加载的命名空间提供的函数。
问题是,当通过lein ring server
执行代码时,我会收到Java异常,告诉我我要访问的命名空间不可用。
但是,如果我运行lein repl
,然后运行(use 'spurious-clojure-example.routes.home)
这个相关的顶级命名空间;然后(require '[spurious-aws-sdk-helper.core :as core])
这个命名空间 - 就像我稍后会展示的代码中所演示的那样 - 然后命名空间将可用,随后对函数的调用就不会出错了?
我不确定它是否是一种误导性错误,实际上并不是我尝试要求的命名空间有问题,而是它内部的某些内容有问题?但如果是真的,为什么手动在lein repl
中调用它时可以正常工作呢?
(ns spurious-clojure-example.routes.home
(:use [amazonica.aws.s3])
(:require [compojure.core :refer :all]
[environ.core :refer [env]]
[spurious-clojure-example.views.layout :as layout]))
(if (env :debug)
(do
(require '[spurious-aws-sdk-helper.core :as core])
(require '[spurious-aws-sdk-helper.utils :refer [endpoint cred]])
(core/configure {:s3 "test-bucket4"
:sqs "test-queue4"
:ddb (slurp "./resources/config/schema.yaml")})))
(def bucket-path "news-archive/dev/election2014-council_title")
(def content
(apply str (line-seq
(clojure.java.io/reader
(:object-content
(get-object (cred (endpoint :spurious-s3)) :bucket-name "shared" :key bucket-path))))))
(defn home []
(layout/common [:h1 content]))
(defroutes home-routes
(GET "/" [] (home)))
(core/configure ...)
调用会触发一个Java异常,指出“core”命名空间不可用。但在 lein repl
中运行以下代码可以正常工作...
(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 server
运行它时。
我已经开始阅读关于(ns-resolve)
的解释: http://technomancy.us/143
但是它提到的解决方案:(ns-resolve 'core 'configure)
没有起作用,它只是抛出了一个Unable to resolve symbol: core in this context
的错误信息。
~/.lein/profiles.clj
以便(env :debug)
返回true
吗? - T.Gounellecontent
中使用了cred
。除非打开了debug
配置文件,否则它将不可用,并可能导致错误。 - deadghostcred
,这将是我需要考虑修复的另一个问题(很可能是util
命名空间,我只需显式加载;因为无论如何我都需要那个功能)。 - Integralist