This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2018-07-16
Channels
- # beginners (48)
- # cider (21)
- # clara (6)
- # cljdoc (3)
- # cljs-dev (11)
- # cljsrn (5)
- # clojure (30)
- # clojure-canada (1)
- # clojure-dusseldorf (2)
- # clojure-italy (10)
- # clojure-losangeles (2)
- # clojure-nl (4)
- # clojure-russia (8)
- # clojure-spain (18)
- # clojure-uk (39)
- # clojurescript (84)
- # core-async (17)
- # cursive (22)
- # data-science (27)
- # datomic (27)
- # docker (3)
- # editors (5)
- # emacs (2)
- # figwheel-main (18)
- # fulcro (54)
- # hoplon (3)
- # hyperfiddle (2)
- # immutant (4)
- # jobs (1)
- # jobs-discuss (1)
- # lein-figwheel (7)
- # leiningen (3)
- # lumo (1)
- # onyx (5)
- # re-frame (64)
- # reagent (5)
- # reitit (7)
- # ring-swagger (6)
- # shadow-cljs (118)
- # specter (23)
- # tools-deps (38)
Hey everyone! Does anyone know how to keep a lein process running after it spawned some server? I’m trying to create a simple lein plugin to just run the new nREPL server, but I hit a surprising roadblock - the server starts and then lein just exits and kills it.
(defn nrepl
"Start a headless nREPL server within your project's context."
[project & args]
(println args)
(eval/eval-in-project
project
`(start-nrepl ~(convert-args args))))
(this just uses the start-nrepl
wrapper from cider-nrepl
and passes it a hash with the params it normally expects.
I took a look at https://github.com/technomancy/leiningen/blob/master/src/leiningen/repl.clj and I don’t quite understand everything it does to spin the headless server, so I decided it might be simpler to ask here.Basically it seems to me that the magic happens here:
(defn server [project cfg headless?]
(nrepl.ack/reset-ack-port!)
(when-not (nrepl-dependency? project)
(main/info "Warning: no nREPL dependency detected.")
(main/info "Be sure to include org.clojure/tools.nrepl in :dependencies"
"of your profile."))
(let [prep-blocker @eval/prep-blocker
ack-port (:port @ack-server)]
(-> (bound-fn []
(binding [eval/*pump-in* false]
(let [[evals requires]
(server-forms project cfg ack-port headless?)]
(eval/eval-in-project project
`(do ~(ignore-sigint-form) ~evals)
requires))))
(Thread.) (.start))
(when project @prep-blocker)
(when headless? @(promise))
(if-let [repl-port (nrepl.ack/wait-for-ack
(get-in project [:repl-options :timeout] 60000))]
(do (main/info "nREPL server started on port"
repl-port "on host" (:host cfg)
(str "- nrepl://" (:host cfg) ":" repl-port))
repl-port)
(main/abort "REPL server launch timed out."))))
But I wondered if there isn’t some general purpose machinery in Lein for dealing with daemons.