At work, we have recently converted our projects to the Clojure CLI and
deps.edn. There were a few commands from Leiningen that I needed to find an equivalent for when working with dependencies.
Download all dependencies
Often in a CI environment, you want to download all of the dependencies for a project before building the project. In Leiningen, you can use
lein deps to do this.
You can use
clojure -P to Prepare the project with the Clojure CLI. This downloads libs and caches the classpath.
Note that you should avoid running
clojure -P in parallel on new environments (like CI). When running
clojure -P for the first time, it will set up files in
~/.clojure and clone gitlibs. If you run multiple processes doing this simultaneously, you can get race conditions that throw errors.
View the dependency tree
When debugging dependency issues, it’s often helpful to see which library pulled in a transitive dependency.
Leiningen can print the dependency showing the resolved transitive dependencies.
$ lein deps :tree [clansi "1.0.0"] [clj-kondo "2022.03.09" :scope "test"] [babashka/fs "0.1.2" :scope "test"] [cheshire "5.10.2" :scope "test"] [com.fasterxml.jackson.dataformat/jackson-dataformat-cbor "2.12.4" :scope "test" :exclusions [[com.fasterxml.jackson.core/jackson-databind]]] [com.fasterxml.jackson.dataformat/jackson-dataformat-smile "2.12.4" :scope "test" :exclusions [[com.fasterxml.jackson.core/jackson-databind]]] [tigris "0.1.2" :scope "test"] [com.cognitect/transit-clj "1.0.324" :scope "test"] # ...
clojure has a similar command, though with a slightly different output. In contrast to Leiningen,
clojure prints the entire dependency tree. Dependencies
clojure didn’t select get an
X in front of them, and a short reason like
:excluded. These views can be helpful when debugging why you didn’t get the version you expected.
$ clojure -Stree org.clojure/clojure 1.11.0 . org.clojure/spec.alpha 0.3.218 . org.clojure/core.specs.alpha 0.2.62 org.clojure/java.classpath 1.0.0 clansi/clansi 1.0.0 org.clojure/data.json 2.4.0 org.slf4j/slf4j-simple 2.0.0-alpha1 . org.slf4j/slf4j-api 2.0.0-alpha1 org.owasp/dependency-check-core 7.0.2 . us.springett/cpe-parser 2.0.2 X org.slf4j/slf4j-api 1.7.30 :older-version . com.vdurmont/semver4j 3.1.0 X org.slf4j/slf4j-api 1.7.36 :older-version
View the Classpath
While dependency trees can help track down dependency problems, sometimes you need to see the actual classpath.
Tip: I like to use
| tr ':' '\n' | sort to get a sorted list of the classpath entries.
You can do this in Leiningen:
lein classpath # or lein classpath | tr ':' '\n' | sort
Both Leiningen and
clojure have more commands for dependencies; you can read more about them at Dep Expansion, Deps and CLI, and lein deps.