2015-08-22 8 views
7

Possiedo un progetto Luminus con il server in esecuzione su localhost:7000. Io uso cider-connect di allegare a me stesso di questo repl, ma sto incontrato con il seguente muro:Come posso collegare il debugger di CIDER a un'applicazione web Luminus?

; 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 

immagino almeno uno di questi è necessaria per il debug; tentativi di strumento una funzione resa

clojure.lang.LispReader$ReaderException: java.lang.RuntimeException: \ 
    No reader function for tag dbg 

posso mettere a punto proprio bene con un progetto di 'normale' Clojure. Ho provato ad aggiungere il testo standard che va normalmente in ~/.lein/profiles.clj per il progetto di project.clj a nessun effetto:

:profiles/dev {:dependencies [[org.clojure/tools.nrepl "0.2.10"]] 
       :plugins [[cider/cider-nrepl "0.10.0-SNAPSHOT"]]} 

Come faccio a collegare il debugger di sidro a questa applicazione web?

+0

Non sono sicuro del sidro, ma avete visto questo: http://www.luminusweb.net/docs/deployment.md#enabling_nrepl –

+0

@Ballpark Oh, in realtà ho capito questo! Ho dimenticato che era di questa domanda. Risponderò stasera. –

+0

@SeanAllred Mi piacerebbe vedere questa risposta – WorldsEndless

risposta

8

Nell'interesse di risparmiare tempo per le persone che hanno problemi simili, inserirò qui un sommario come risposta. Grazie a Benedek Fazekas dal gattopardo clojure-emacs/refactor-nrepl e Sean Allred.


Per allegare Cider a Luminus applicazione (e probabilmente qualsiasi altra applicazione che utilizza incorporato nrepl server come opportunità di collegare ad esso mentre è in esecuzione) si dovrebbe fare due cose:

  • fornire tutti i desiderata middleware come :handler a clojure.tools.nrepl.server/start-server. Per fare ciò dovresti avere librerie che contengono il middleware elencato da qualche parte dove possono trovarle lein (ad esempio in project.clj:dependencies).

  • Eseguire l'applicazione che avvia nrepl server incorporato e connettere Cider utilizzando cider-connect.

Accanto cider-nrepl voglio usare refactor-nrepl che è necessaria per Clojure refactor. Con progetto di esempio da Luminus website prima cosa che si può fare in questo modo:

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

Quindi è possibile eseguire il Luminus app con lein run e collegarlo con Cider usando cider-connect (M-x cider-connect o C-c M-c di), URL predefinito per la connessione è localhost:7000.


Presumibilmente, incastonato in nrepl serverLuminus è destinato ad essere utilizzato quando l'applicazione è già stato distribuito da qualche parte e si vuole fare un po 'di debug dal vivo. per lo sviluppo locale c'è modo standard:

  • corsa lein repl nella radice del progetto. Cider eseguirà il lavoro con lein repl :headless su cider-jack-in (C-c M-j).
  • dovrebbe avviare repl nello spazio dei nomi yourapp.core in cui è possibile eseguire (http/start {:port 3000 :init init :handler app}) e divertirsi! In questo caso non abbiamo bisogno di embedded nrepl server. Per arrestare il server http eseguire (http/stop destroy). È descritto here.
+2

Grazie mille per averlo scritto :-) –

Problemi correlati