Ну, это просто.Вкратце, необходимо выполнить несколько шагов:
- пакет
nrepl
должен быть частью производственной сборки, а не просто зависимостью от dev; - Когда ваше приложение запускается, он также порождает сеанс repl в отдельном потоке на определенном порту;
- ваш сервер либо предоставляет этот порт, либо вы туннелируете его через 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
и все готово: вы подключены к удаленному приложению.