如何将 CIDER 的调试器附加到 Luminus 网络应用程序?
How can I attach CIDER's debugger to a Luminus web application?
我在 localhost:7000
上有一个服务器 运行 的 Luminus 项目。我使用 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
我想调试至少需要其中之一;尝试检测函数 yield
clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: \
No reader function for tag dbg
我可以很好地调试 'normal' 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 应用程序?
为了节省遇到类似问题的人的时间,我将post 总结为答案。
感谢来自 clojure-emacs/refactor-nrepl
的 gitter 和 Sean Allred 的 Benedek Fazekas。
要将 Cider
附加到 Luminus
应用程序(可能还有任何其他使用嵌入式 nrepl server
作为在 运行ning 时连接它的机会的应用程序)你应该做两件事:
将所有需要的中间件提供为 :handler
到 clojure.tools.nrepl.server/start-server
。为此,您应该将包含中间件的库列在 lein
可以找到它们的地方(例如 project.clj
:dependencies
)。
运行 启动嵌入式 nrepl server
并使用 cider-connect
.
连接 Cider
的应用程序
除了 cider-nrepl
我想使用 Clojure refactor. With example project from Luminus website 需要的 refactor-nrepl
首先可以这样做:
(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})))
然后您可以使用 lein run
运行 您的 Luminus
应用,并使用 cider-connect
(M-x cider-connect
或 C-c M-c
), 默认 url 连接是 localhost:7000
.
据推测,Luminus
中嵌入的 nrepl server
旨在在应用程序已部署在某处并且您想进行一些实时调试时使用。
对于本地开发,有标准方式:
- 运行
lein repl
在项目根目录中。 Cider
将在 cider-jack-in
(C-c M-j
) 上与 lein repl :headless
一起完成工作。
- 它应该在
yourapp.core
命名空间中启动 repl
,在那里您可以 运行 (http/start {:port 3000 :init init :handler app})
并享受!在这种情况下,我们不需要嵌入 nrepl server
。停止 http 服务器 运行 (http/stop destroy)
。它被描述为 here.
我在 localhost:7000
上有一个服务器 运行 的 Luminus 项目。我使用 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
我想调试至少需要其中之一;尝试检测函数 yield
clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: \
No reader function for tag dbg
我可以很好地调试 'normal' 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 应用程序?
为了节省遇到类似问题的人的时间,我将post 总结为答案。
感谢来自 clojure-emacs/refactor-nrepl
的 gitter 和 Sean Allred 的 Benedek Fazekas。
要将 Cider
附加到 Luminus
应用程序(可能还有任何其他使用嵌入式 nrepl server
作为在 运行ning 时连接它的机会的应用程序)你应该做两件事:
将所有需要的中间件提供为
:handler
到clojure.tools.nrepl.server/start-server
。为此,您应该将包含中间件的库列在lein
可以找到它们的地方(例如project.clj
:dependencies
)。运行 启动嵌入式
连接nrepl server
并使用cider-connect
.Cider
的应用程序
除了 cider-nrepl
我想使用 Clojure refactor. With example project from Luminus website 需要的 refactor-nrepl
首先可以这样做:
(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})))
然后您可以使用 lein run
运行 您的 Luminus
应用,并使用 cider-connect
(M-x cider-connect
或 C-c M-c
), 默认 url 连接是 localhost:7000
.
据推测,Luminus
中嵌入的 nrepl server
旨在在应用程序已部署在某处并且您想进行一些实时调试时使用。
对于本地开发,有标准方式:
- 运行
lein repl
在项目根目录中。Cider
将在cider-jack-in
(C-c M-j
) 上与lein repl :headless
一起完成工作。 - 它应该在
yourapp.core
命名空间中启动repl
,在那里您可以 运行(http/start {:port 3000 :init init :handler app})
并享受!在这种情况下,我们不需要嵌入nrepl server
。停止 http 服务器 运行(http/stop destroy)
。它被描述为 here.