Clojure - как подключиться к запущенному процессу REPL удаленно - PullRequest
0 голосов
/ 22 сентября 2018

Как я могу подключиться к сеансу REPL, запущенному на удаленном сервере, к которому я могу получить доступ, например, через SSH?

Ответы [ 5 ]

0 голосов
/ 24 ноября 2018

Кстати, вы можете легко подключиться из одного приложения REPL / clojure к другому REPL (например, для сравнения результатов eval между dev и UAT), как это

=> (require '[clojure.tools.nrepl :as repl])
nil
=> (with-open [conn (repl/connect :port 59258)]
     (-> (repl/client conn 1000)    ; message receive timeout required
       (repl/message {:op "eval" :code "(+ 2 3)"})
       repl/response-values))
[5]

подробнее здесь https://nrepl.org/nrepl/usage/clients.html#_talking_to_an_nrepl_endpoint_programmatically

0 голосов
/ 25 сентября 2018

Ну, это просто.Вкратце, необходимо выполнить несколько шагов:

  1. пакет nrepl должен быть частью производственной сборки, а не просто зависимостью от dev;
  2. Когда ваше приложение запускается, он также порождает сеанс repl в отдельном потоке на определенном порту;
  3. ваш сервер либо предоставляет этот порт, либо вы туннелируете его через SSH.

Теперь подробности:

1) Добавьте эти депы в основной :dependencies вектор:

:dependencies [[org.clojure/clojure "1.9.0"]
                 ;; for remote debugging
                 [cider/cider-nrepl "0.17.0"]
                 [org.clojure/tools.nrepl "0.2.13"]

Вам понадобится cider-nrepl, если вы работаете с Emacs / Cider.В противном случае вы можете пропустить это.

2) Добавить отдельное пространство имен для сервера nrepl wrap:

(ns project.nrepl
  (:require [clojure.tools.nrepl.server
             :refer (start-server stop-server)]))


(defn nrepl-handler []
  (require 'cider.nrepl)
  (ns-resolve 'cider.nrepl 'cider-nrepl-handler))


(defonce __server (atom nil))

(def set-server! (partial reset! __server))


(def port 7888)

(defn start
  []
  (when-not @__server
    (set-server!
     (start-server :port port :handler (nrepl-handler)))))


(defn stop
  []
  (when-let [server @__server]
    (stop-server server)
    (set-server! nil)))


(defn init
  []
  (start))

В вашем основном модуле просто позвоните (project.nrepl/init).Теперь ваше приложение позволяет подключаться к нему через nrepl.

3) На удаленном сервере вы можете открыть порт TCP 7888 для внешнего мира, который небезопасен.По крайней мере, порт должен быть ограничен определенными IP-адресами, например, вашим офисом.Лучшим вариантом было бы переслать его через SSH следующим образом:

ssh -L 7888:<remote-host>:7888 <user>@<remote-host>

Теперь откройте Emacs, вызовите M-x cider-connect RET localhost 7888 и все готово: вы подключены к удаленному приложению.

0 голосов
/ 23 сентября 2018

возможно ssh туннель (если repl запущен на удаленном хосте от имени localhost: 6666)

на локальном компьютере ssh -L: 6666: localhost: 6666 remoteuser @ remotehost -N -v

затемпросто подключитесь к localhost: 6666

0 голосов
/ 24 сентября 2018

Я просто хочу суммировать два ответа выше.Это работает на моей машине:

На удаленной машине

lein repl :start :port 40000

На локальной машине

# SSH tunnel on one shell
ssh -NL 40000:localhost:40000 username@host

# Connect to the remote repl on another shell
lein repl :connect localhost:40000
0 голосов
/ 22 сентября 2018

Это может быть очевидно для сетевых специалистов, но мне потребовалось некоторое время, чтобы выяснить это, документируя это здесь.

На удаленном сервере, при запуске приложения REPL вместо простого lein repl принудительного связывания с портом:

lein repl :start :port 40000

На вашем компьютере подключитесь к удаленному серверу обычным способом (например, через ssh).Затем подключитесь к своему приложению следующим образом:

lein repl :connect localhost:40000

Вот и все!

...