>
he was explicit that dependency/project management where very hard problems that Clojure didn't really attempt to solve.For what it's worth, having used Clojure for work for a couple years now, and ditching leiningen for deps.edn (built in package and dependency management that hooks into maven), I've not had an issue with it. You just add the dependencies to your deps.edn, and run your program. If your namespace needs something from a package, you add it to the (:require ...) section of your ns declaration.
Here's an example ns from one of our messiest modules:
(ns profusion.core
(:require
[clojure.core.match :refer [match]]
[clojure.set :as set]
[clojure.string :as string]
[clojure.walk :as walk]
[clojure.zip :as z]
[instaparse.core :as insta]
[profusion.infix :refer [infix-to-prefix]]
[profusion.standard-library :refer [comparison]]
[profusion.utils :refer :all]
)
(:import
(org.jgrapht Graph)
(org.jgrapht.traverse TopologicalOrderIterator)
(org.jgrapht.graph
DefaultEdge
SimpleDirectedGraph)
))
To be clear, projects like this can be run with the base Clojure distribution, no additional tools required.
> I'm not aware of any Clojure tools that are best-of-breed for project management. Java has a better model for locking everything down (or maybe how the Linux Distros manage their repositories) and Python has a better model for just keeping up with the current state of things. I'm not aware of any half-and-half model that gives satisfying results.
deps.edn generally asks you for specific versions if you're getting things from maven, so you don't risk not "locking everything down". If you really want to lock everything down however, you should check all your dependencies into your source tree, this is an option that deps.edn supports well, through the :local keyword instead of :mvn/version for maven dependencies. That namespace declaration I showed you is from a subproject that we import into one of our other subprojects using the :local keyword, and the deps.edn for it just declares the source directories and and the dependencies, everything else is handled automatically.