如何设置boot,以便:(a)所有源文件都在当前目录中,(b)每次更改源文件时都会运行单元测试,(c)当包含REPL的源文件更改时,REPL会刷新定义?
具体而言:
-
build.boot
中发生了什么? -
启动REPL的shell命令是什么?和/或REPL中的哪个命令开始监视单元测试?
-
我还需要做其他什么常规设置?
我已经阅读了很多关于引导、引导测试、引导快速测试、引导中的REPL重载和引导刷新的文档,但我没能做太多工作。到目前为止,我发现的文档似乎提供了一些花絮和提示,但并不是将这些东西组合在一起所需要的。
一个适当的build.boot
(以及其他任何东西)的简单例子将特别有用。
到目前为止,这就是我所拥有的(某种程度上)有效的东西。
(set-env!
:dependencies '[
[adzerk/boot-test "1.1.2" :scope "test"]
[org.clojure/tools.namespace "0.2.11"]]
:source-paths #{"."})
(require '[clojure.tools.namespace.repl :as repl :refer [refresh]])
(apply repl/set-refresh-dirs (get-env :directories))
加上当前目录中的一个文件sample.clj
:
(ns sample
(:require [clojure.test :refer :all]))
(defn myfunc [] "this string")
(deftest test-myfunc
(is (= "this string" (myfunc))))
这使引导在当前目录中查找源文件,并使我能够通过在REPL中键入(refresh)
手动重新加载sample.clj
中的更改。(boot (test))
曾经在.clj
文件中手动运行单元测试,但我刚才尝试时失败了,错误为"传递给:core/test的args(0)数量错误"。
做这件事的正确方法是什么?
由于Boot处理监视和通知文件更改的方式,您不能直接使用clojure.tools.namespace.repl/refresh
。
你可以使用包装器-samestep/引导刷新:
(set-env!
:dependencies '[[adzerk/boot-test "1.1.2" :scope "test"]
[samestep/boot-refresh "0.1.0" :scope "test"]]
:source-paths #{"."})
(require '[samestep.boot-refresh :refer [refresh]]
'[adzerk.boot-test :refer :all])
现在您可以启动REPL服务器,它将在文件更改时重新加载:
boot repl -s watch refresh
并从IDE(例如CIDER或Cursive)或通过连接到它
boot repl -c
只要检测到源文件中有更改,就会重新加载适当的命名空间,并在客户端REPL会话中可用。
您也可以在另一个终端中启动boot watch test
以获得自动测试行为。
最后,您的(boot (test))
给传递给:core/test的args(0)的错误数量的问题是因为您不需要包含要调用的test
任务的adzerk.boot-test
。看起来可能有clojure.test/test
可用,而被调用。