【问题标题】:How can I attach CIDER's debugger to a Luminus web application?如何将 CIDER 的调试器附加到 Luminus Web 应用程序?
【发布时间】:2015-11-16 09:13:25
【问题描述】:

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

【问题讨论】:

  • 我不确定苹果酒,但你看到了吗:luminusweb.net/docs/deployment.md#enabling_nrepl
  • @Ballpark 哦,我真的想出了这个!我忘了这就是这个问题的意义所在。今晚我会自己回答。
  • @SeanAllred 我想看看这个答案
  • @SeanAllred 最好在此处发布该答案,以便最终遇到类似问题的其他人可以解决它。
  • @foki 唉——我似乎总是在这里做出承诺,但在自我回答方面我不会遵守。我添加了一个待办事项,但列表很长。在此期间请参阅gitter.im/clojure-emacs/cider?at=55d8c4dfb6d887d9704d21f5

标签: debugging clojure cider luminus


【解决方案1】:

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


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

  • :handlerclojure.tools.nrepl.server/start-server 的形式提供所有所需的中间件。为此,您应该在 lein 可以找到它们的某个位置列出包含中间件的库(例如在 project.clj :dependencies 中)。

  • 运行启动嵌入式nrepl server 的应用程序并使用cider-connectCider 连接到它。

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})))

然后您可以使用lein run 运行您的Luminus 应用程序并使用cider-connectM-x cider-connectC-c M-c)将其与Cider 连接,默认连接的URL 是localhost:7000


大概,在Luminus 中嵌入nrepl server 是为了在应用程序已经部署在某个地方并且您想要进行一些实时调试时使用。 对于本地开发,有标准方法:

  • 在项目根目录中运行lein replCider 将在 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

【讨论】:

  • 非常感谢您写这篇文章 :-)
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 2013-08-28
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多