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错误。
我创建了一个应用程序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)
(处理程序/站点)
(换行基址)))