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

Sea*_*red 7 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
Run Code Online (Sandbox Code Playgroud)

我想至少有一个是调试所必需的; 试图检测功能产量

clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: \
    No reader function for tag dbg
Run Code Online (Sandbox Code Playgroud)

我可以使用'普通'Clojure项目进行调试.我已经尝试添加通常进入~/.lein/profiles.clj项目的样板文件project.clj无效:

:profiles/dev {:dependencies [[org.clojure/tools.nrepl "0.2.10"]]
               :plugins [[cider/cider-nrepl "0.10.0-SNAPSHOT"]]}
Run Code Online (Sandbox Code Playgroud)

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

fok*_*oki 8

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


要附加CiderLuminus应用程序(可能还有任何其他使用嵌入式nrepl server作为运行时连接它的机会的应用程序),您应该做两件事:

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

  • 运行启动嵌入式nrepl serverCider使用连接到它的应用程序cider-connect.

cider-nrepl我想要使​​用Clojure重构refactor-nrepl所需的东西旁边.通过Luminus网站的示例项目,首先可以这样做:

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

然后你可以运行你的Luminus应用程序,lein runCider使用cider-connect(M-x cider-connectC-c M-c)连接它,默认情况下url连接是localhost:7000.


据推测,嵌入nrepl serverLuminus打算当应用程序已经部署的地方要使用你想要做一些现场调试.对于本地开发,有标准方式:

  • lein repl在项目根目录中运行.Cider将用lein repl :headlesson cider-jack-in(C-c M-j)完成工作.
  • 它应该replyourapp.core命名空间中启动,你可以运行(http/start {:port 3000 :init init :handler app})和享受!在这种情况下,我们不需要嵌入式nrepl server.停止http服务器运行(http/stop destroy).这里描述.

  • 非常感谢你写这篇文章:-) (2认同)