如何从clojure/cider/nrepl中的兄弟文件导入内容?
我有一个关于如何从clojure/cider/nrepl中的兄弟文件导入内容?,clojure,classpath,cider,nrepl,Clojure,Classpath,Cider,Nrepl,我有一个关于~/src/proj/{foo,bar}.clj的小项目,我正在用emacs、cider和nREPL进行黑客攻击。在bar.clj中,我执行(def base-13-joke 42)并且我希望foo.clj中的代码引用bar.clj的base-13-joke。我该怎么做 我当前的类路径(使用~/src/proj=/jonas/src/mine/code/移动框) 我尝试了(添加类路径)file:///jonas/src/mine/code/move-the-box“以及(cider
~/src/proj/{foo,bar}.clj
的小项目,我正在用emacs、cider和nREPL进行黑客攻击。在bar.clj
中,我执行(def base-13-joke 42)
并且我希望foo.clj
中的代码引用bar.clj
的base-13-joke
。我该怎么做
我当前的类路径(使用
~/src/proj
=/jonas/src/mine/code/移动框
)
我尝试了
(添加类路径)file:///jonas/src/mine/code/move-the-box“
以及(cider.nrepl.middleware.util.java/add-classpath)!”file:///home/jonas/src/mine/code/move-the-box“”
这会引发IllegalArgumentException数组元素类型不匹配java.lang.reflect.array.set(Array.java:-2)
。这是怎么回事?如果您将多个Clojure源文件作为一个项目来使用,您将从使用诸如或之类的构建工具中获得很多好处。例如,下面介绍如何创建一个名为myproject
的简单启动项目,其中包含多个源文件
首先,创建一个包含以下内容的myproject
目录(无论在何处):
myproject
├── build.boot
└── src
└── myproject
├── bar.clj
└── foo.clj
Boot将先运行build.Boot
文件,然后再执行其他操作(例如运行部分代码、创建JAR或启动REPL)。现在,您只需告诉Boot您的源文件将位于src
目录中,所以只需将这一行添加到build.Boot
:
(set-env! :source-paths #{"src"})
(require '[myproject.foo :as foo])
在bar.clj
中,输入要从其他代码访问的定义:
(ns myproject.bar)
(def base-13-joke 42)
然后,在foo.clj
中,您可以在ns
声明中使用:require
子句引用bar.clj
:
(ns myproject.foo
(:require [myproject.bar :as bar]))
(defn make-joke []
(println (Long/toString bar/base-13-joke 13)))
这就是它的全部内容!当然,您可能希望实际使用您刚刚编写的代码执行某些操作。Boot通过任务处理“执行操作”。让我们编写一个只运行您项目中的一个函数的程序
当您想定义一个任务来使用Boot运行时,您可以通过将定义该任务的代码添加到build.Boot
文件中来实现。不过,首先,因为我们将调用一些主代码(在本例中,myproject.foo
命名空间中的make joke
函数),我们需要要求
该代码。将此行添加到build.boot
:
(set-env! :source-paths #{"src"})
(require '[myproject.foo :as foo])
现在我们可以定义一个简单的run
任务(同样,在build.boot
中)来运行我们的函数:
(deftask run []
(with-pass-thru _
(foo/make-joke)))
带pass-thru的业务只与Boot中任务的一些细节有关,您可以详细阅读这些细节
执行任务非常简单。从项目根目录在命令行中运行此命令:
$ boot run
33
Boot还附带一些内置任务。例如,如果您运行Boot repl
,您将在Boot.user
命名空间中看到熟悉的repl提示:
boot.user=>
此命名空间与Boot执行build.Boot
脚本的命名空间相同,因此,由于我们在build.Boot
中有require
用于myproject.foo
,因此我们可以在REPL中使用该命名空间:
boot.user=> (foo/make-joke)
33
nil
当然,您也可以要求其他名称空间:
boot.user=> (require '[myproject.bar :as bar])
nil
boot.user=> bar/base-13-joke
42
你可以用Boot做更多的事情,比如重新加载代码和与苹果酒交互,你可以在