如何将CIDER的调试器附加到Luminus Web应用程序?

时间:2015-08-22 14:04:46

标签: debugging clojure cider luminus

我有一个Luminus项目,服务器在localhost:7000上运行。我使用cider-connect将自己附加到此repl,但我遇到了以下墙:

; CIDER 0.10.0snapshot (package: 20150820.852) \
    (Java 1.7.0_51, Clojure 1.7.0, nREPL 0.2.10)
WARNING: The following required nREPL ops are not supported: 
apropos classpath complete eldoc format-code format-edn info inspect-pop \
    inspect-push inspect-refresh macroexpand ns-list ns-vars ns-path refresh \
    resource stacktrace toggle-trace-var toggle-trace-ns undef
Please, install (or update) cider-nrepl 0.10.0-SNAPSHOT and restart CIDER

我认为调试至少需要其中一个;试图检验函数产量

clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: \
    No reader function for tag dbg

我可以使用'普通'Clojure项目进行调试。我已经尝试将通常位于~/.lein/profiles.clj的样板文件添加到项目的project.clj中而不起作用:

:profiles/dev {:dependencies [[org.clojure/tools.nrepl "0.2.10"]]
               :plugins [[cider/cider-nrepl "0.10.0-SNAPSHOT"]]}

如何将CIDER的调试器附加到此Web应用程序?

1 个答案:

答案 0 :(得分:8)

为了节省有类似问题的人的时间,我将在这里发布摘要作为答案。 感谢来自clojure-emacs/refactor-nrepl的gitter和Sean Allred的Benedek Fazekas。

要将Cider附加到Luminus应用程序(以及可能使用嵌入式nrepl server的任何其他应用程序作为在其运行时连接它的机会),您应该做两个事情:

  • 将所有需要的中间件:handler提供给clojure.tools.nrepl.server/start-server。要做到这一点,你应该有包含lein可以找到它们的地方列出的中间件的库(例如在project.clj :dependencies中)。

  • 运行启动嵌入式nrepl server的应用程序,并使用Cidercider-connect连接到该应用程序。

cider-nrepl旁边,我想使用Clojure refactor所需的refactor-nrepl。使用来自Luminus website的示例项目,首先可以这样做:

(ns guestbook.core
  (:require [guestbook.handler :refer [app init destroy]]
            [immutant.web :as immutant]
            [guestbook.db.migrations :as migrations]
            [clojure.tools.nrepl.server :as nrepl]
            [clojure.tools.logging :as log]
            [environ.core :refer [env]]
            [cider.nrepl :refer [cider-middleware]]
            [refactor-nrepl middleware])
  (:gen-class)) 

    ...

(defn cider&cljr-nrepl-handler []
      (apply nrepl/default-handler (cons #'refactor-nrepl.middleware/wrap-refactor
                                   (map resolve cider-middleware))))

(defn start-app
  "e.g. lein run 3000"
  [[port]]
  (let [port (http-port port)]
    (.addShutdownHook (Runtime/getRuntime) (Thread. stop-app))
    (when-let [repl-port (env :nrepl-port)]
      (repl/start {:port (parse-port repl-port)
                   :handler (cider&cljr-nrepl-handler)}))
    (http/start {:handler app
                 :init    init
                 :port    port})))

然后,您可以使用Luminus运行lein run应用,并使用Cidercider-connectM-x cider-connect)将其与C-c M-c相关联,要连接的默认网址是localhost:7000

据推测,nrepl server中的嵌入式Luminus旨在在某个地方部署应用程序并且您想要进行实时调试时使用。 对于本地开发,有标准的方式:

  • 在项目根目录中运行lein replCider将在lein repl :headless cider-jack-inC-c M-jrepl上完成这项工作。
  • 它应该在yourapp.core命名空间中启动(http/start {:port 3000 :init init :handler app}),您可以在其中运行nrepl server并享受!在这种情况下,我们不需要嵌入(http/stop destroy)。停止http服务器运行{{1}}。它被描述为here