8

我有一个 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 应用程序?

4

1 回答 1

10

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


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

  • 提供所有所需的:handler中间件clojure.tools.nrepl.server/start-server。为此,您应该在lein可以找到它们的某个地方列出包含中间件的库(例如在 中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})))

然后您可以运行您的Luminus应用程序并使用(或)lein run连接它,默认情况下连接的 url 是.Cidercider-connectM-x cider-connectC-c M-clocalhost:7000


据推测,嵌入nrepl serverLuminus目的是在应用程序已经部署在某个地方并且您想要进行一些实时调试时使用。对于本地开发,有标准方法:

  • lein repl在项目根目录中运行。Cider将使用lein repl :headlesson cider-jack-in( C-c M-j) 完成工作。
  • 它应该在您可以运行和享受repl的命名空间中启动!在这种情况下,我们不需要嵌入。停止 http 服务器运行。此处对其进行了描述。yourapp.core(http/start {:port 3000 :init init :handler app})nrepl server(http/stop destroy)
于 2016-01-05T11:32:06.240 回答