lein repl在错误的命名空间中启动

7

简而言之;

lein repl命令会从project.clj中定义的:main命名空间开始,而不是默认的user命名空间。

细节

我有一个Leiningen项目,部署为超级JAR包形式的命令行应用程序,因此可以像下面这样运行它:

java -jar my-app-1.0-standalone.jar --some --args

我还有一个dev/user.clj,可以给我提供一个漂亮的REPL环境,如这里所述

我的project.clj长这样:

(defproject my-app "1.0"
  :main my-app.cli
  :aot [my-app.cli]

  :profiles {:dev {:source-paths ["src" "dev"]}})

当我使用命令行中的lein repl或从Emacs中的M-x cider-jack-in启动REPL时,我处于my-app.cli命名空间,而不是user
如果我从project.clj中删除:main my-app.cli,我的REPL将在user命名空间中启动,但很明显这会破坏我的uberjar。
有任何想法吗?
1个回答

6

当运行 lein repl 任务时,它会按照以下优先顺序查找要切换的命名空间:

  1. 在 :repl-options 的 :init-ns 中指定的命名空间
  2. 在 :main 中指定的命名空间
  3. 用户命名空间

在您的情况下,请尝试添加:

:repl-options {:init-ns user}

添加到你的project.clj文件中。

运行完美!谢谢您。 - Josh Glover
1
这个还能用吗?我刚在Clojure 1.9.0-beta2下的Leiningen 2.7.1中尝试了一下,但是出现了这个错误:Could not locate user__init.class or user.clj on classpath。它确实在user命名空间中启动,但在到达那里之前有一个很大的堆栈跟踪。 - Ben Kovitz
@Ben Kovitz:尝试创建src/user.clj。我可以在没有它的情况下重现您的错误,当我创建user.clj时,我没有收到任何错误提示。 - Teodor

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