clj-reinit
is to clj-reload/init as integrant-repl is to tools.namespace/integrant.
Except it's way cooler.
io.github.z-silver/clj-reinit {:git/tag "0.1.0" :git/sha "e90477d"}
There is no jar release at the moment. Apologies for the inconvenience.
Because unlike the tools based on tools.namespace
, clj-reinit
offers not only reloading on demand but also reloading automatically. That is: it is capable of reloading your code as soon as you save it, without the need to explicitly ask for a reload. If you've used figwheel or shadow-cljs, you should be familiar with this workflow.
Because I've recently discovered init
and find it nicer to use than integrant
.
I was slightly bummed out that there was no equivalent to integrant-repl
for init
. But since I had also recently learned about clj-reload
, which I prefer over tools.namespace
, I figured: why not?
Since I'm very used to the instant feedback cycle you typically get with Clojurescript, I decided to also attempt to do something similar for JVM Clojure, which is not something I've seen before.
We exploit the fact that clj-reload
expects you to tell it which directories your source code is located, and use it to spin up a watcher that detects whenever a file in those directories has changed. We also exploit the fact that we're using init
and piggyback on it to manage the lifetime of said watcher.
Similar to integrant-repl
, we expect the user to choose a var containing a configuration function. This is because we otherwise have no way of knowing what system you want to run.
I recommend reading the source code comments for all the details, as well as dev/user.clj
for a tiny example of how you may set up your own project's dev environment.
If compilation fails during a reload, you'll have to manually run reset
after you fix your code. This is because reloading stops the system, which also stops the watcher component. You'll also need to call clear-error
, because we use an agent to hold the system state.
If you need to run commands in the REPL after having an auto-reload, you'll still need to run reset
to make the new version of the code available in the REPL. For this reason, auto-reloading is actually off by default and needs to be explicitly enabled.
clj-reload
andinit
, the foundations which we compose together.- dirwatch, for implementing a very nice, no-nonsense interface over Java's WatchService.
integrant-repl
, the direct inspiration for this lib.- You, for taking the time to read and perhaps use this.