正在为Clojure/boot寻求简单的工作流设置



如何设置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可用,而被调用。

最新更新