7

我已经安装了 boot-clj,并且希望能够在外部编辑器中编辑 .clj 文件,并单独运行一个命令行 REPL,我可以从中调用我在 .clj 文件中更改的函数。不需要特殊的重新加载命令。

另一件事是我不想手动键入命令来包含命名空间 - 我只想运行一个脚本,将我带入命名空间,这样我就可以立即调用现有函数。

文件名:

C:\dev\my-project\src\my_project\utils.clj

文件中的一些内容:

(ns my-project.utils
  (:require
    [clojure.string :as s]))

(defn my-range [start end]
  (take (- end start) (iterate inc start)))

我想直接进入 REPL 并(my-range 0 3)查看它是否产生我想要的结果。

这是什么设置?我需要运行的脚本文件是什么样的?

我目前的理解是答案看起来像这样:

(deftask dev-repl
  (set-env! …)
  (repl))
4

1 回答 1

9

在命令行

您可以在命令行中在某种程度上实现此目的,而无需创建build.boot文件:

在 C:\dev\my_project

boot -r src repl -n my-project.utils
  • boot -r src: 从“资源路径”开始引导src,这是在 JVM 中可访问的目录集。
  • repl -n my-project.utils启动一个 REPL,需要你的命名空间,然后输入它。

当 REPL 运行时,在你编辑完之后C:\dev\my_project\src\my_project\utils.clj,你可以像这样在 REPL 中重新加载它:

my-project.utils=> (require 'my-project.utils :reload)
nil

最小的build.boot

或者,您可以C:\dev\my_project\build.boot使用以下内容创建文件:

(set-env! :resource-paths #{"src"})

(deftask dev 
  "Run a development REPL"
  []
  (repl :init-ns 'my-project.utils))

然后,在C:\dev\my_project

boot dev

这也将在您的命名空间中启动一个 REPL,但需要较少的命令行配置,因为我们已经在 中执行了配置build.bootboot它将自动评估。

注意:从 Clojure REPL 中,无论构建工具如何,您都可以使用函数要求任何命名空间(只要它位于 JVM 的类路径上)并使用require函数输入它in-ns

build.boot 自动重新加载

最后,可以结合 Boot 的特性来实现以自动重新加载代码为导向的开发工作流程。

C:\dev\my_project\build.boot

(set-env! :resource-paths #{"src"})

(require '[boot.core :as core]
         '[boot.pod  :as pod])

(deftask load-ns
  "Loads the my-project.utils namespace in a fresh pod."
  []
  (let [pods (pod/pod-pool (core/get-env))]
    (core/with-pre-wrap [fileset]
      (pod/with-eval-in (pods :refresh)
        ;; We require indirectly here so that errors from my-project.utils have
        ;; proper line and column information.
        (require 'my-project.load-impl))
      fileset)))

(deftask dev
  "Watches source code and loads my-project/utils every time code changes."
  []
  (comp (watch)
        (load-ns)))

C:\dev\my_project\src\my_project\load_impl.clj

(ns my-project.load-impl)

(require 'my-project.utils)

C:\dev\my_project\src\my_project\utils.clj

(ns my-project.utils
  (:require
    [clojure.string :as s]))

(defn my-range [start end]
  (take (- end start) (iterate inc start)))

(println "In the code!")
(println "(my-range 0 10) = " (my-range 10 20))

返回命令提示符,键入boot dev. 您应该看到一些println输出,每次编辑和保存文件时,您应该再次看到它,反映您所做的任何更改。

于 2015-12-17T02:42:23.940 回答