簡體   English   中英

Clojure:在特定命名空間中啟動repl

[英]Clojure: boot repl in a particular namespace

我安裝了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))

在命令行

您可以在命令行中在某種程度上實現此目的,而無需創建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.boot執行了配置,因此需要較少的命令行配置,該boot將自動進行評估。

注:從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輸出,每次編輯和保存文件時,您應該再次看到它,反映您所做的任何更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM