vlaaad / remote-repl

Remote repl for Clojure

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Remote repl

Clojars Project

Rationale

Sometimes I want to open a remote socket repl from my repl, but Clojure does not provide a way to do this out of the box.

Usage

To give it a try, you need a socket repl available on the network. You can start it with this shell command:

$ clj "-J-Dclojure.server.repl={:port 5555 :accept clojure.core.server/repl}" 

Now you can connect to that process from another process

$ clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.2.12"}}}'
Clojure 1.10.1
user=> (require '[vlaaad.remote-repl :as rr])
nil
user=> (rr/repl :port 5555)
;; at this point, forms sent to the repl are evaluated on the remote process 
user=> (System/getProperty "clojure.server.repl")
"{:port 5555 :accept clojure.core.server/repl}"
user=> :repl/quit
;; now we are back to evaluating in our local process.
nil
user=> 

You can use -main to immediately drop into a remote repl:

$ clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.2.12"}}}' -m vlaaad.remote-repl :port 5555
user=> (System/getProperty "clojure.server.repl")
"{:port 5555 :accept clojure.core.server/repl}"
user=> :repl/quit

You can use -X style invocation:

$ clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.2.12"}}}' -X vlaaad.remote-repl/repl :port 5555

You can install remote repl as a tool:

clj -Ttools install \
  vlaaad/remote-repl '{:git/url "https://github.com/vlaaad/remote-repl.git" :git/tag "v1.2.12"}' \
  :as remote-repl
clj -Tremote-repl repl :port 5555

Reconnecting

It might be useful to automatically reconnect to the remote REPL. For example, you might want to restart your REPL server during development to update dependencies. You can use :reconnect true option to keep the REPL client reconnecting, that way it will keep connecting to the remote REPL while the JVM is alive.

Example:

$ clj -Sdeps '{:deps {vlaaad/remote-repl {:mvn/version "1.2.12"}}}' \
  -X vlaaad.remote-repl/repl \
  :port 5757 :reconnect true
Reconnecting to localhost:5757
Reconnecting to localhost:5757
...

Then, start a REPL server on port 5757 in a different terminal:

$ clj -J-Dclojure.server.repl='{:port 5555 :accept clojure.core.server/repl}'

Once it starts, first terminal will establish the connection:

...
Reconnecting to localhost:5757
Reconnecting to localhost:5757
user=> 

Acknowledgements

This project is similar to tubular, but smaller (only 70 lines of code and no dependencies). It is inspired by clojure.core.server/remote-prepl, but does not require its target to be a prepl.

About

Remote repl for Clojure

License:MIT License


Languages

Language:Clojure 100.0%