Clojure:在特定命名空间中启动 repl
Clojure: boot repl in a particular namespace
我已经安装了 boot-clj,并希望能够在外部编辑器中编辑 .clj 文件,并单独拥有一个命令行 REPL 运行ning,我可以从中调用我更改的函数.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))
在命令行
您可以在命令行中在某种程度上实现这一点,而无需创建 build.boot
文件:
C:\dev\my_project:
boot -r src repl -n my-project.utils
boot -r src
:在 "resource paths" 上以 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.boot
中执行了配置,boot
将自动评估。
Note: from a Clojure REPL, regardless of build tool, you can require any namespace (as long as it's on the JVM's class path) with the require
function and enter it with the in-ns
function.
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
输出,并且每次您编辑和保存文件时您应该再次看到它,反映您所做的任何更改。
我已经安装了 boot-clj,并希望能够在外部编辑器中编辑 .clj 文件,并单独拥有一个命令行 REPL 运行ning,我可以从中调用我更改的函数.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))
在命令行
您可以在命令行中在某种程度上实现这一点,而无需创建 build.boot
文件:
C:\dev\my_project:
boot -r src repl -n my-project.utils
boot -r src
:在 "resource paths" 上以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.boot
中执行了配置,boot
将自动评估。
Note: from a Clojure REPL, regardless of build tool, you can require any namespace (as long as it's on the JVM's class path) with the
require
function and enter it with thein-ns
function.
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
输出,并且每次您编辑和保存文件时您应该再次看到它,反映您所做的任何更改。