Clojure: boot repl in a particular namespace

前端 未结 1 444
你的背包
你的背包 2021-02-09 07:35

I have boot-clj installed and want to be able to edit a .clj file in an external editor and separately have a command line REPL running from which I can call the functions that

1条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-02-09 08:21

    at the command line

    You can achieve this to some degree at the command line, without creating a build.boot file:

    In C:\dev\my_project:

    boot -r src repl -n my-project.utils
    
    • boot -r src: starts boot with src on the "resource paths", which is the set of directories that will be accessible within the JVM.
    • repl -n my-project.utils starts a REPL, requires your namespace, and enters it.

    While the REPL is running, and after you have edited C:\dev\my_project\src\my_project\utils.clj, you can reload it at the REPL like this:

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

    minimal build.boot

    Alternatively, you could create the file C:\dev\my_project\build.boot with these contents:

    (set-env! :resource-paths #{"src"})
    
    (deftask dev 
      "Run a development REPL"
      []
      (repl :init-ns 'my-project.utils))
    

    Then, in C:\dev\my_project:

    boot dev
    

    Which will also start a REPL in your namespace, but requires less command-line configuration as we've performed the configuration in build.boot, which boot will automatically evaluate.

    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 with automatic reloading

    Finally, it's possible to combine features of Boot to achieve a development workflow oriented around automatically reloading code.

    In 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)))
    

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

    (ns my-project.load-impl)
    
    (require 'my-project.utils)
    

    In 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))
    

    Back at the command prompt, type boot dev. You should see some println output, and every time you edit and save the file you should see it again, reflecting any changes you made.

    0 讨论(0)
提交回复
热议问题