Skip to content

Commit 4a6be9f

Browse files
arichiardibbatsov
authored andcommitted
Add a simple nrepl-server task in cider.tasks (#532)
It forwards to cider.nrepl.main/init passing options -b|--bind and -p|--port.
1 parent eb2b5a2 commit 4a6be9f

File tree

3 files changed

+54
-18
lines changed

3 files changed

+54
-18
lines changed

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ it on the command line through the `cider.tasks/add-middleware` task
155155
functionality):
156156

157157
```
158-
boot -d org.clojure/tools.nrepl:0.2.12 -d cider/cider-nrepl:0.x.y-SNAPSHOT -i "(require 'cider.tasks)" cider.tasks/add-middleware -m cider.nrepl.middleware.apropos/wrap-apropos -m cider.nrepl.middleware.version/wrap-version repl -s wait
158+
boot -d org.clojure/tools.nrepl:0.2.12 -d cider/cider-nrepl:0.x.y-SNAPSHOT -i "(require 'cider.tasks)" cider.tasks/add-middleware -m cider.nrepl.middleware.apropos/wrap-apropos -m cider.nrepl.middleware.version/wrap-version cider.tasks/nrepl-server wait
159159
```
160160

161161
Or for all of their projects by adding a `~/.boot/profile.boot` file like so:
@@ -164,14 +164,15 @@ Or for all of their projects by adding a `~/.boot/profile.boot` file like so:
164164
(set-env! :dependencies '[[org.clojure/tools.nrepl "0.2.12"]
165165
[cider/cider-nrepl "0.x.y-SNAPSHOT"]])
166166

167-
(require '[cider.tasks :refer [add-middleware]])
167+
(require '[cider.tasks :refer [add-middleware nrepl-server]])
168168

169169
(task-options! add-middleware {:middleware '[cider.nrepl.middleware.apropos/wrap-apropos
170170
cider.nrepl.middleware.version/wrap-version]})
171171
```
172172

173-
And then launching `boot add-middleware repl -s wait`. Note that this
174-
is not necessary when using the standard `cider-jack-in`.
173+
And then launching `boot add-middleware nrepl-server wait`.
174+
175+
Note that this is not necessary when using the standard `cider-jack-in`.
175176

176177
For more information visit [boot-clj wiki](https://github.com/boot-clj/boot/wiki/Cider-REPL).
177178

src/cider/tasks.clj

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,25 @@
1111
symbol."
1212
[m middleware MIDDLEWARE #{sym} "Name of the middleware to inject"]
1313
(if-let [default-middleware (resolve 'boot.repl/*default-middleware*)]
14-
(do (util/dbug* "Boot's default middleware: %s\n" (vec @@default-middleware))
14+
(do (util/dbug* "Current middleware: %s\n" (vec @@default-middleware))
1515
(swap! @default-middleware concat middleware)
1616
(util/dbug* "After cider-nrepl injection: %s\n" (vec @@default-middleware)))
1717
(util/dbug "Cannot resolve boot.repl/*default-middleware*, skipping middleware injection...\n"))
1818
identity)
19+
20+
(deftask nrepl-server
21+
"Start a nREPL server.
22+
23+
Optionally accepts port and host.
24+
25+
Note that the boot.repl/*default-middleware* atom is read for the list of the
26+
middleware symbols."
27+
[b bind ADDR str "The address server listens on."
28+
p port PORT int "The port to listen on and/or connect to."]
29+
(let [default-mws @@(resolve 'boot.repl/*default-middleware*)]
30+
(util/dbug* "nREPL middleware: %s\n" (vec default-mws))
31+
(boot.core/with-pass-thru [_]
32+
(require 'cider-nrepl.main)
33+
((resolve 'cider-nrepl.main/init) {:middleware default-mws
34+
:port port
35+
:bind bind}))))

src/cider_nrepl/main.clj

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,50 @@
88
(require (symbol (namespace thing)))
99
(resolve thing))
1010

11+
(def resolve-mw-xf
12+
(comp (map require-and-resolve)
13+
(keep identity)))
14+
1115
(defn- handle-seq-var
1216
[var]
1317
(let [x @var]
1418
(if (sequential? x)
15-
(map require-and-resolve x)
19+
(into [] resolve-mw-xf x)
1620
[var])))
1721

22+
(def mw-xf
23+
(comp (map symbol)
24+
resolve-mw-xf
25+
(mapcat handle-seq-var)))
26+
1827
(defn- ->mw-list
1928
[middleware-var-strs]
20-
(mapcat (comp handle-seq-var require-and-resolve symbol)
21-
middleware-var-strs))
29+
(into [] mw-xf middleware-var-strs))
30+
31+
(defn start-nrepl
32+
[opts]
33+
(let [{:keys [handler middleware bind port]} opts
34+
35+
handler (cond-> (or handler nrepl.server/default-handler)
36+
middleware (apply (->mw-list middleware)))
2237

23-
(defn- start-nrepl
24-
[handler]
25-
(let [nrepl-port (io/file ".nrepl-port")
2638
{:keys [server-socket port] :as server}
27-
(nrepl.server/start-server :handler handler)
28-
bind (-> server-socket (.getInetAddress) (.getHostName))]
29-
(doto nrepl-port
39+
(nrepl.server/start-server :handler handler
40+
:bind bind
41+
:port port)
42+
43+
bind
44+
(-> server-socket (.getInetAddress) (.getHostName))]
45+
(doto (io/file ".nrepl-port")
3046
(spit port)
3147
(.deleteOnExit))
3248
(println (format "nREPL server started on port %d on host %s - nrepl://%s:%d" port bind bind port))
3349
server))
3450

3551
(defn init
36-
[middleware-syms]
37-
(start-nrepl (apply nrepl.server/default-handler (->mw-list middleware-syms)))
38-
;; Return nil so the value doesn't print
39-
nil)
52+
([]
53+
(init nil))
54+
([opts]
55+
(start-nrepl opts)
56+
;; Return nil so the value doesn't print
57+
nil))

0 commit comments

Comments
 (0)