我有一个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

我想至少其中之一是调试所必需的;尝试检测函数 yield

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应用程序?

最佳答案

为了节省有类似问题的人的时间,我将在此处发布摘要作为答案。
感谢clojure-emacs/refactor-nrepl的苦恼者Benedek Fazekas和Sean Allred。

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

  • 提供所有所需的中间件作为:handlerclojure.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应用程序,并使用Cider(cider-connectM-x cider-connect)将其与C-c M-c连接,默认情况下,要连接的URL是localhost:7000

    大概是,当应用程序已部署在某处并且您想进行一些实时调试时,应使用nrepl server中嵌入的Luminus
    对于本地开发,有标准方法:
  • 在项目根目录中运行lein replCider将在lein repl :headless(cider-jack-in)上使用C-c M-j来完成这项工作。
  • 它应该在repl命名空间中启动yourapp.core,您可以在其中运行(http/start {:port 3000 :init init :handler app})并享受它!在这种情况下,我们不需要嵌入的nrepl server。要停止http服务器,请运行(http/stop destroy)。描述为here
  • 关于debugging - 如何将CIDER的调试器附加到Luminus Web应用程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32157019/

    10-09 17:43