如何升级Leiningen的nREPL版本?

44

我使用 leiningenemacs + cider 进行 clojure 开发。几天前,通过 Emacs 包管理器升级了 cider 后,当我运行 M-x cider-connectM-x cider-jack-in 时,出现以下警告信息。

; CIDER 0.9.0snapshot (package: 20150222.137) (Java 1.8.0_31, Clojure 1.6.0, nREPL 0.2.6)
WARNING: CIDER requires nREPL 0.2.7 to work properly
user> 

警告消息清楚地表明我需要将nrepl升级到0.2.7,然而,我不知道如何操作。

我通过brew安装了leiningen,它使用的是nrepl 0.2.6

$ lein repl
nREPL server started on port 53218 on host 127.0.0.1 - nrepl://127.0.0.1:53218
REPL-y 0.3.5, nREPL 0.2.6
Clojure 1.6.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_31-b13
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=>

Leiningen配置文件的内容为:

{:user {:plugins [[cider/cider-nrepl "0.9.0-SNAPSHOT"]]}}

问题: 如何升级Leiningen使用的nREPL版本?


1
CIDER 可以与旧版本的 nREPL 一起使用,但其中存在一些微妙且不太显而易见的错误。有人应该真正更新与 lein 和 reply 捆绑的 nREPL。 - Bozhidar Batsov
1
看起来 nREPL 已经在 lein 的主分支中更新了。 - Bozhidar Batsov
4个回答

56

我刚刚遇到了这个问题,通过在profiles.clj中显式地添加对更新版本的tools.nrepl的依赖项来解决它。我的~/.lein/profiles.clj:

{:repl {:plugins [[cider/cider-nrepl "0.9.0-SNAPSHOT"]]
        :dependencies [[org.clojure/tools.nrepl "0.2.7"]]}}

不知道那是否是最佳或官方的做法,但是。


3
看起来nRepl 2.7之前存在一些bug,具体请见https://github.com/clojure-emacs/cider/issues/970。我认为这个依赖关系已经在lein主干上更新,但可能尚未发布,因此添加对较新版本的依赖关系可能是正确的修复方法,不过您可能需要在下一个lein更新后删除该依赖项。 - Tim X
2
注意...只要依赖项在profiles.clj中而不是项目的project.clj中,这对我有效。 - Matthew Moss
5
使用这个确切的profiles.clj文件,Leiningen会下载nREPL 0.2.7版本的文件,但是对于我来说仍然会启动nREPL 0.2.6,无论是在Windows 7上还是OS X上。 - Shannon Severance
1
@ShannonSeverance 我猜你和我犯了同样的错误,就是把tools.nrepl版本向量放在:plugins向量而不是:dependencies向量中... - Blake Miller
请参考peterfoldi的答案,看看现在是否需要更新。 - Joe Corneli

9

Lein有一个升级命令,因此在最简单的情况下

lein upgrade

如果您使用软件包管理器安装了Leiningen,您可能需要执行以下步骤(以OS X为例,Linux发行版有自己出色的软件包管理器):

brew unlink leiningen
brew update
brew install leiningen

这对我有用。我最近将我的操作系统更新为El Capitan,但没有更新Leiningen。因此,Cider nRepl开始抱怨。感谢您的帮助。 - systemhalted

9

在@matthew-moss的基础上,还有一个额外的说明:只有当您从clojure项目中运行lein repl时,才会使用tools.nrepl依赖项。例如,如果您从主目录中运行lein repl,则最终使用编译到leiningen中的tools.nrepl版本。原因未知。

希望这能为某人节省时间。


3
作为对已接受答案的补充:在使用者profiles.clj中添加对0.2.7的依赖对我之前几天有效,但突然间我又遇到了0.2.6警告。执行"lein deps :tree"命令时会出现以下这行:
[org.clojure/tools.nrepl "0.2.7" :scope "test" :exclusions [[org.clojure/clojure]]]

这让我想到可能是lein-test-refresh插件(在同一个profiles.clj文件中定义)在这里造成了一些混淆。阅读有关配置文件的更多信息后,我了解到了^:replace提示。对于我来说,依赖项中的这行代码现在可以正常工作:

^:replace [org.clojure/tools.nrepl "0.2.7"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接