Clojure 命名空间不可访问

Int*_*ist 5 clojure leiningen read-eval-print-loop

我正在尝试从库“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呢?

我指的代码是:https : //github.com/Integralist/spurious-clojure-example/blob/baseline/src/spurious_clojure_example/routes/home.clj#L9-L10

(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)))
Run Code Online (Sandbox Code Playgroud)

(core/configure ...)是触发 Java 异常的调用,说明“核心”命名空间不可用。但是从lein repl工作正常运行以下代码...

(use 'spurious-clojure-example.routes.home)
(require '[spurious-aws-sdk-helper.core :as core])
(core/configure ...rest of code...)
Run Code Online (Sandbox Code Playgroud)

更新 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")}))
Run Code Online (Sandbox Code Playgroud)

...当在 REPL 中运行它时,它工作正常。

问题是通过lein ring server.

我已经开始阅读(ns-resolve)这里:http : //technomancy.us/143

但它建议的解决方案:(ns-resolve 'core 'configure)不起作用;它只是抛出了一个Unable to resolve symbol: core in this context错误。

mav*_*ozo 2

我创建了一个应用程序lein new compojure-app,当:debug值是真实的时,需要clojure.string :as str,然后还打印一些东西到 shell。

下面的代码通过lein ring server. 我用:debugvaluetrue和对其进行了测试false。我在你的例子中看到,你使用environso,我把{:debug true}or {:debug false}in .lein-env

    (ns 积分主义者.handler
      (:require [compojure.core :refer [defroutes 路由]]
                [ring.middleware.resource:参考[wrap-resource]]
                [ring.middleware.file-info:参考[wrap-file-info]]
                [hiccup.middleware:参考[wrap-base-url]]
                [compojure.handler:作为处理程序]
                [compojure.route:作为路线]
                [integralist.routes.home :参考 [home-routes]]
                [environ.core:参考[env]]))

    (当(env:调试)
      (需要 '[clojure.string :as str]))

    (当(env:调试)
      (定义它有效![]
        (println "它有效!:" (str/split "Clojure 太棒了" #" "))))

    (定义初始化[]
      (println“积分主义者正在开始”)
      (当(env:调试)
        (有用!)))

    (定义销毁[]
      (println“整合者正在关闭”))

    (取消路由应用程序路由
      (路线/资源“/”)
      (路线/未找到“未找到”))

    (定义应用程序
      (-> (路线 home-routes app-routes)
          (处理程序/站点)
          (换行基址)))