我在远程站点上有一个clojure程序,让我们称之为mccarthy.我想要做的是连接到nrepl-ritz我的笔记本电脑,最好是使用nrepl-ritz-jack-in.插孔适用于本地程序,但似乎没有连接到远程程序.
C-x C-f 上 /mccarthy:code/program/project.clj
(require 'nrepl-ritz)
M-x nrepl-ritz-jack-in
Emacs似乎挂了.如果我去*nrepl-server*缓冲区,我会看到:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.flatland.drip.Main.invoke(Main.java:117)
at org.flatland.drip.Main.start(Main.java:88)
at org.flatland.drip.Main.main(Main.java:64)
Caused by: java.lang.AssertionError: Assert failed: project
at leiningen.ritz_nrepl$start_jpda_server.invoke(ritz_nrepl.clj:23)
at leiningen.ritz_nrepl$ritz_nrepl.doInvoke(ritz_nrepl.clj:95)
Run Code Online (Sandbox Code Playgroud)
(还有很多其他线路......)
我drip在我的笔记本电脑上使用,但没有使用mccarthy,所以显然nrepl-ritz-jack-in没有检测到它是一个远程文件.nrepl-jack-in但是,在这种情况下,常规旧的将按预期工作.
我也试过一个开始nrepl-ritz使用lein上mccarthy:
mattox@mccarthy$ lein ritz-nrepl
nREPL server started on port 42874
Run Code Online (Sandbox Code Playgroud)
从我的笔记本电脑,我转发端口,因此本地42874 …
在Eclipse + Counterclockwise中,当我想连接到REPL时,对话框告诉我可以通过HTTP使用nREPL:

如何设置?这是否与吊桥有关?虽然lein repl :connect http://my.url/repl为我工作,但我无法将这些工作整合在一起.
为清楚起见,与传统REPL相比,为什么这是有用的:经典REPL仅适用于localhost.您可以通过SSH端口隧道来桥接它,但是这个 - 通过HTTP的REPL - 是远程"实时"服务器的可行替代方案.
为了完整性,服务器端:
我今天刚刚通过el-get安装了苹果酒.当我在emacs中启动苹果酒时,会打印以下横幅:
; CIDER 0.8.0-snapshot (Java 1.7.0_65, Clojure 1.6.0, nREPL 0.2.6)
WARNING: The following required nREPL ops are not supported:
eldoc ns-list ns-vars undef
Please, install (or update) cider-nrepl 0.8.0-snapshot and restart CIDER
WARNING: CIDER's version (0.8.0-snapshot) does not match cider-nrepl's version (0.7.0)
user>
Run Code Online (Sandbox Code Playgroud)
我可以在苹果酒中运行我的单元测试,但很多其他的东西都不起作用,比如文档查找等.请注意,提示也在用户名称空间中,而不是项目名称空间.
我的〜/ .lein/profiles.clj
{:user
{:plugins
[[cider/cider-nrepl "0.7.0"]]}
}
Run Code Online (Sandbox Code Playgroud)
我看到lein下载了所需内容(然后是一些,奇怪的是):
$ find ~/.m2 -name "*nrepl*"
~/.m2/repository/cider/cider-nrepl
~/.m2/repository/cider/cider-nrepl/0.8.0-SNAPSHOT/cider-nrepl-0.8.0-20140914.152356-14.jar.sha1
~/.m2/repository/cider/cider-nrepl/0.8.0-SNAPSHOT/cider-nrepl-0.8.0-20140914.152356-14.pom
~/.m2/repository/cider/cider-nrepl/0.8.0-SNAPSHOT/cider-nrepl-0.8.0-20140914.152356-14.jar
~/.m2/repository/cider/cider-nrepl/0.8.0-SNAPSHOT/cider-nrepl-0.8.0-20140914.152356-14.pom.sha1
~/.m2/repository/cider/cider-nrepl/0.8.0-SNAPSHOT/cider-nrepl-0.8.0-SNAPSHOT.pom
~/.m2/repository/cider/cider-nrepl/0.8.0-SNAPSHOT/cider-nrepl-0.8.0-SNAPSHOT.jar
~/.m2/repository/cider/cider-nrepl/0.7.0/cider-nrepl-0.7.0.jar.sha1
~/.m2/repository/cider/cider-nrepl/0.7.0/cider-nrepl-0.7.0.pom.sha1
~/.m2/repository/cider/cider-nrepl/0.7.0/cider-nrepl-0.7.0.jar
~/.m2/repository/cider/cider-nrepl/0.7.0/cider-nrepl-0.7.0.pom
~/.m2/repository/org/clojure/tools.nrepl
~/.m2/repository/org/clojure/tools.nrepl/0.2.6/tools.nrepl-0.2.6.pom.sha1
~/.m2/repository/org/clojure/tools.nrepl/0.2.6/tools.nrepl-0.2.6.pom
~/.m2/repository/org/clojure/tools.nrepl/0.2.6/tools.nrepl-0.2.6.jar.sha1
~/.m2/repository/org/clojure/tools.nrepl/0.2.6/tools.nrepl-0.2.6.jar
Run Code Online (Sandbox Code Playgroud)
我也看到lein想要引入cider-nrepl和tools.nrepl,虽然我当然不明白为什么:
$ lein deps :tree
warn
[cider/cider-nrepl …Run Code Online (Sandbox Code Playgroud) 我刚开始在Clojure开发服务.我对如何接近服务器关机感到有点迷茫.
我正在使用Clojure 1.5.1.对于日志记录,我使用的是Timbre 1.5.3.我想将NREPL嵌入到我的服务器中以进行热代码部署.
这是我的core.clj文件.核心是我的主要,我正在使用"lein new app"生成的app shell.
(ns extenium.core
(:require [taoensso.timbre :as t]
[clojure.tools.nrepl.server :as nrs])
(:gen-class))
(def nrepl-server)
(defn start-nrepl-server []
(t/info "Starting nrepl server on port 8628")
(alter-var-root #'nrepl-server
(constantly
(nrs/start-server :port 8628)))
(t/info "Started nrepl server"))
(defn stop-nrepl-server []
(t/info "Stopping nrepl server")
(nrs/stop-server nrepl-server)
(t/info "Stopped nrepl server"))
(defn start []
(alter-var-root #'*read-eval*
(constantly
false))
(start-nrepl-server))
(defn stop []
(stop-nrepl-server))
(defn -main [& args]
(start))
Run Code Online (Sandbox Code Playgroud)
当我"lein run"时,nrepl-server按预期启动,并将信息消息发送到终端.然后我与Emacs的"nrepl"联系.没问题.从Emacs我执行"(extenium.core/stop)".此时,我在Emacs上收到"Stopping nrepl server"消息(意味着stdout被重定向到客户端).连接关闭(如预期的那样),我从未看到"已停止的nrepl服务器"消息.精细.
我看着终端,我没有看到"停止......"或"停止..."的消息.相反,我得到以下异常:
Exception in thread "nREPL-worker-0" java.lang.Error: …Run Code Online (Sandbox Code Playgroud) 我正在尝试从端口7888上运行另一个链接的Docker容器的Docker容器连接到nREPL.尽管暴露了端口-p 7888,将容器链接到-link <first_container_name>:repl并使用Docker注入的环境主机和端口变量,我得到了一个"拒绝连接".错误.
docker run -i -t -p 7888 clojure-image lein repl :headless :port 7888
~$ nREPL server started on port 55555 on host 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
docker run -i -t -link <first_container_name>:repl clojure-image /bin/bash
username@hostname~$ lein repl :connect 172.0.2.1:7888
Run Code Online (Sandbox Code Playgroud)
为什么我的连接被拒绝了?我能够在Docker容器之间连接其他服务,如AMQP.
如何从clj命令启动nREPL ?
我无法使用Lein或Boot运行我的项目,因为我在某处有一个不平衡的paren,并且读者抱怨`java.lang.RuntimeException:从第13行开始的read-cond需要偶数个表单.
我在Ubuntu机器上运行.我已经emacs23安装了,但它看起来像是nREPL可以使用的emacs24.所以,我卸载emacs23,安装emacs24.我删除了现有的.emacs文件和.emacs.d目录.
然后我跑M-x package-list-packages,并安装clojure-mode和nrepl.
我创建了一个Clojure项目,lein new foobar然后尝试打开默认core.clj文件.它让我自动进入Clojure模式,但如果我输入M-x nrepl-jack-in(在core.clj缓冲区中),它说Starting nREPL server...,但我从未看到任何命名的缓冲区*nrepl*(基于阅读文档,这是预期的结果).我只是Starting nREPL server...无限期地看到了迷你缓冲区.
现在,一个名为缓冲*nrepl-server* 被创建,它说:
REPL started; server listening on localhost port 5871
Exception Unsupported option(s) supplied: :headless clojure.core/load-libs (core.clj:5266)
clojure.core=>
Run Code Online (Sandbox Code Playgroud)
但它似乎并不是非常有用(我似乎无法让它在那个缓冲区中评估任何东西?!?).
我试着谷歌搜索,但我找不到任何似乎有这个问题的人.我想玩Clojure(core.logic特别是),但这是一个完全不起作用的.:-(
我一直在读这个,但似乎没有教程/文档关于这两者之间的区别或诸如此类的东西.
套接字repl会替换nrepl吗?
我在我的leiningen项目文件中设置了:dev配置文件.这为我的repl会话定义了:init和:init-ns设置.如果我在emacs(Mx nrepl-jack-in)中使用光标在我的project.clj中的:dev关键字上启动nrepl,则启动repl并使用:init和:init-ns设置.如果我将光标放在其他位置,则初始命名空间不同(测试ns,而不是用户),并且:尚未评估init.
我猜这是某种特征,(我更倾向于认为它现在是随机的行为),但任何人都可以解释它或指向那些这样做的文档吗?此外,有没有办法在repl启动后更改配置文件?
谢谢
我创建了一个新项目lein.我core.clj在emacs中打开.我确保跑M-x clojure-mode,并且M-x nrepl-enable-on-existing-clojure-buffers.
然后我跑,M-x nrepl-jack-in并在我得到的迷你缓冲区
启动nREPL服务器...
然后是一条消息,例如:
连接的.如果你优化一切,你一定会感到不快. - 唐纳德克努特
我看到缓冲区名称是*nrepl*,但缓冲区不包含Clojure Repl,而是完全空白.
如果我输入任何东西(意思是任何东西),我得到:
错误的类型参数:integer-or-marker-p,nil
如果我切换回我的core.clj缓冲区,并点击C-c C-l,我得到迷你缓冲区中缓冲区中最后一个函数的命名空间名称.如果我将光标放在函数定义的末尾并点击C-x C-e,我得到:
CompilerException java.lang.RuntimeException:无法在此上下文中解析符号:x,编译:(NO_SOURCE_PATH:1:1)
我尝试使用没有依赖项的新lein目录,lein new project-name并尝试上述相同的步骤并得到相同的结果.
我还能检查什么和/或我做错了什么?
编辑:附加信息
当我在空*nrepl*缓冲区中C-x C-e键入内容并尝试按下我键入的内容时,在迷你缓冲区中我收到消息:
没有Lisp子进程; 看变量`inferior-lisp-buffer'
另外,我正在运行:
GNU Emacs 24.3.1
Leiningen 2.1.2 on Java 1.6.0_27 OpenJDK 64位服务器VM