diff options
| author | eltrac <hi@eltr.ac> | 2026-10-06 18:04:31 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-10-06 18:41:19 +0800 |
| commit | fd654982376da9d913c4867f70aade62a75abe01 (patch) | |
| tree | 2e97947091cba885a1321625035cf6e73700bf30 | |
| parent | 4030d4d921fed3e9abea28268fe499fbaedb5dfc (diff) | |
dev: hot reloading
- add start/stop/restart/watch functions in 'user namespace (dev
profile)
- add lein alias `dev` that starts file watcher and REPL
- every time source code is changed, `lein dev` reloads modified
namespaces and restarts system
- add `lein dev` to Contributors' Guide
| -rw-r--r-- | dev/user.clj | 27 | ||||
| -rw-r--r-- | doc/CONTRIBUTING.md | 4 | ||||
| -rw-r--r-- | project.clj | 35 |
3 files changed, 37 insertions, 29 deletions
diff --git a/dev/user.clj b/dev/user.clj new file mode 100644 index 0000000..2ebcdb0 --- /dev/null +++ b/dev/user.clj @@ -0,0 +1,27 @@ +(ns user + (:require [clj-reload.core :as reload] + [nextjournal.beholder :as beholder] + [weepinbell.core])) + +(reload/init + {:dirs ["src" "dev" "test"]}) + +(defonce stop-fn (atom nil)) + +(defn start [] + {:pre [(nil? @stop-fn)]} + (reset! stop-fn (@(resolve 'weepinbell.core/start-system)))) + +(defn stop [] + {:pre [(fn? @stop-fn)]} + (@stop-fn) + (reset! stop-fn nil)) + +(defn restart [] + (stop) + (reload/reload) + (start)) + +(defn watch [] + (beholder/watch (fn [_] ((requiring-resolve 'user/restart))) "src")) + diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md index 010a3ca..cb82836 100644 --- a/doc/CONTRIBUTING.md +++ b/doc/CONTRIBUTING.md @@ -43,10 +43,10 @@ To start REPL: lein repl
```
-To start a dev server:
+To start a dev server (and an REPL):
```
-lein ring server
+lein dev
```
To run project:
diff --git a/project.clj b/project.clj index 60b0b01..fa2d666 100644 --- a/project.clj +++ b/project.clj @@ -19,39 +19,20 @@ [com.taoensso/timbre "6.8.0"] [clj-rss "0.4.0"]] :managed-dependencies [[org.clojure/tools.reader "1.6.0"] - [org.ow2.asm/asm "9.8"]] + [org.ow2.asm/asm "9.8"]] :profiles {:uberjar {:aot :all} :test {:dependencies [[ring/ring-mock "0.6.2"]]} - :cljsbuild {:dependencies [[org.clojure/clojurescript "1.11.132"]]}} + :dev {:source-paths ["dev"] + :repl-options {:init-ns user + :init (do (start) (watch))} + :dependencies [[io.github.tonsky/clj-reload "1.0.0"] + [com.nextjournal/beholder "1.0.3"]]}} + :aliases {"dev" ["with-profile" "+dev" "repl"]} :main ^:skip-aot weepinbell.core ;; plugins :plugins [[lein-ancient "0.6.15"] - [lein-ring "0.12.6"] ;; latest commits of cloverage were "co-authored" by Claude ;; we'll keep it on this version for now [lein-cloverage "1.2.2"] - [dev.weavejester/lein-cljfmt "0.16.5"] - ;; for frontend - [lein-cljsbuild "1.1.8"]] - :ring {:handler weepinbell.handler/app} - :cljsbuild - {:builds - {:dev - {:source-paths ["src-fe"] - :compiler - {:main bellsprout.core - :output-to "resources/public/js/main.js" - :output-dir "resources/public/js/out" - :asset-path "js/out" - :optimizations :none - :source-map true - :target :browser}} - :prod - {:source-paths ["src-fe"] - :compiler - {:main bellsprout.core - :output-to "resources/public/js/main.js" - :output-dir "target/cljsbuild" - :optimizations :advanced - :pretty-print false}}}}) + [dev.weavejester/lein-cljfmt "0.16.5"]]) |
