Clarify docs, add tests for transitive deps
This commit clarifies some things in the docs based on PR review. It also adds additional test coverage for managed dependencies; specifically, a case where two normal dependencies both have a transitive dependency on the same library, but with different versions. The test validates that this conflict is properly resolved via `:managed-dependencies`.
This commit is contained in:
parent
2fb603b2bf
commit
7ea847d16f
4 changed files with 44 additions and 19 deletions
|
@ -23,13 +23,14 @@ regular `:dependencies` section, with two exceptions:
|
||||||
|
|
||||||
1. It does not actually introduce any dependencies to your project. It only says,
|
1. It does not actually introduce any dependencies to your project. It only says,
|
||||||
"hey leiningen, if you encounter one of these dependencies later, here are the
|
"hey leiningen, if you encounter one of these dependencies later, here are the
|
||||||
versions that you should use."
|
versions that you should fall back to if the version numbers aren't explicitly
|
||||||
|
specified."
|
||||||
2. It allows the version number to be omitted from the `:dependencies` section,
|
2. It allows the version number to be omitted from the `:dependencies` section,
|
||||||
for any artifact that you've listed in your `:managed-dependencies` section.
|
for any artifact that you've listed in your `:managed-dependencies` section.
|
||||||
|
|
||||||
Here's an example:
|
Here's an example:
|
||||||
|
|
||||||
```clojure
|
```clj
|
||||||
(defproject superfun/happyslide "1.0.0-SNAPSHOT"
|
(defproject superfun/happyslide "1.0.0-SNAPSHOT"
|
||||||
:description "A Clojure project with managed dependencies"
|
:description "A Clojure project with managed dependencies"
|
||||||
:min-lein-version "2.7.0"
|
:min-lein-version "2.7.0"
|
||||||
|
@ -59,7 +60,7 @@ the [`lein-parent` plugin](https://github.com/achin/lein-parent). This plugin
|
||||||
will allow you to define a single "parent" project that is inherited by multiple
|
will allow you to define a single "parent" project that is inherited by multiple
|
||||||
"child" projects; e.g.:
|
"child" projects; e.g.:
|
||||||
|
|
||||||
```
|
```clj
|
||||||
(defproject superfun/myparent "1.0.0"
|
(defproject superfun/myparent "1.0.0"
|
||||||
:managed-dependencies [[clj-time "0.12.0"]
|
:managed-dependencies [[clj-time "0.12.0"]
|
||||||
[me.raynes/fs "1.4.6"]
|
[me.raynes/fs "1.4.6"]
|
||||||
|
|
|
@ -158,33 +158,48 @@
|
||||||
(:dependencies managed-deps-project)
|
(:dependencies managed-deps-project)
|
||||||
(:managed-dependencies managed-deps-project)))
|
(:managed-dependencies managed-deps-project)))
|
||||||
;; the list of deps from the managed deps section that aren't used
|
;; the list of deps from the managed deps section that aren't used
|
||||||
unused-managed-deps (remove
|
unused-managed-deps (-> (remove
|
||||||
(fn [dep]
|
(fn [dep]
|
||||||
(some (partial coordinates-match? dep) merged-deps))
|
(or (some (partial coordinates-match? dep) merged-deps)
|
||||||
managed-deps)
|
;; special-casing to remove tools.reader, which is a common transitive dep
|
||||||
|
;; of two of our normal dependencies
|
||||||
|
(= 'org.clojure/tools.reader (first dep))))
|
||||||
|
managed-deps))
|
||||||
;; deps that have classifiers
|
;; deps that have classifiers
|
||||||
classified-deps (filter
|
classified-deps (filter
|
||||||
#(some #{:classifier} %)
|
#(some #{:classifier} %)
|
||||||
merged-deps)]
|
merged-deps)]
|
||||||
;; make sure the sample data has some unmanaged deps, some unused managed deps,
|
;; make sure the sample data has some unmanaged deps, some unused managed deps,
|
||||||
;; and some classified deps, for completeness
|
;; and some classified deps, for completeness
|
||||||
(is (not (empty? versioned-unmanaged-deps)))
|
(is (seq versioned-unmanaged-deps))
|
||||||
(is (not (empty? unused-managed-deps)))
|
(is (seq unused-managed-deps))
|
||||||
(is (not (empty? classified-deps)))
|
(is (seq classified-deps))
|
||||||
;; delete all of the existing artifacts for merged deps
|
;; delete all of the existing artifacts for merged deps
|
||||||
(doseq [[n v] merged-deps]
|
(doseq [[n v] merged-deps]
|
||||||
(delete-file-recursively (m2-dir n v) :silently))
|
(delete-file-recursively (m2-dir n v) :silently))
|
||||||
;; delete all of the artifacts for the managed deps too
|
;; delete all of the artifacts for the managed deps too
|
||||||
(doseq [[n v] managed-deps]
|
(doseq [[n v] managed-deps]
|
||||||
(delete-file-recursively (m2-dir n v) :silently))
|
(delete-file-recursively (m2-dir n v) :silently))
|
||||||
|
;; delete all copies of tools.reader so we know that the managed dependency
|
||||||
|
;; for it is taking precedence
|
||||||
|
(delete-file-recursively (m2-dir 'org.clojure/tools.reader) :silently)
|
||||||
(deps managed-deps-project)
|
(deps managed-deps-project)
|
||||||
;; artifacts should be available for all merged deps
|
;; artifacts should be available for all merged deps
|
||||||
(doseq [[n v] merged-deps]
|
(doseq [[n v] merged-deps]
|
||||||
(is (.exists (m2-dir n v)) (str n " was not downloaded.")))
|
(is (.exists (m2-dir n v)) (str n " was not downloaded (missing dir '" (m2-dir n v) "').")))
|
||||||
;; artifacts should *not* have been downloaded for unused managed deps
|
;; artifacts should *not* have been downloaded for unused managed deps
|
||||||
(doseq [[n v] unused-managed-deps]
|
(doseq [[n v] unused-managed-deps]
|
||||||
(is (not (.exists (m2-dir n v))) (str n " was unexpectedly downloaded.")))
|
(is (not (.exists (m2-dir n v))) (str n " was unexpectedly downloaded (found unexpected dir '" (m2-dir n v) "').")))
|
||||||
;; artifacts with classifiers should be available
|
;; artifacts with classifiers should be available
|
||||||
(doseq [[n v _ classifier] classified-deps]
|
(doseq [[n v _ classifier] classified-deps]
|
||||||
(let [f (m2-file n v classifier)]
|
(let [f (m2-file n v classifier)]
|
||||||
(is (.exists f) (str f " was not downloaded."))))))
|
(is (.exists f) (str f " was not downloaded."))))
|
||||||
|
;; check tools.reader explicitly, since it is our special transitive dependency
|
||||||
|
(let [tools-reader-versions (into [] (.listFiles (m2-dir 'org.clojure/tools.reader)))]
|
||||||
|
(is (= 1 (count tools-reader-versions)))
|
||||||
|
(is (= (first tools-reader-versions) (m2-dir 'org.clojure/tools.reader
|
||||||
|
(->> managed-deps
|
||||||
|
(filter
|
||||||
|
(fn [dep] (= 'org.clojure/tools.reader (first dep))))
|
||||||
|
first
|
||||||
|
second)))))))
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
(:require [leiningen.core.project :as project]
|
(:require [leiningen.core.project :as project]
|
||||||
[leiningen.core.user :as user]
|
[leiningen.core.user :as user]
|
||||||
[leiningen.core.test.helper :as helper]
|
[leiningen.core.test.helper :as helper]
|
||||||
[clojure.java.io :as io])
|
[clojure.java.io :as io]
|
||||||
|
[clojure.string :as str])
|
||||||
(:import (java.io ByteArrayOutputStream PrintStream FileDescriptor
|
(:import (java.io ByteArrayOutputStream PrintStream FileDescriptor
|
||||||
FileOutputStream)))
|
FileOutputStream)))
|
||||||
|
|
||||||
|
@ -11,9 +12,13 @@
|
||||||
|
|
||||||
(def tmp-dir (System/getProperty "java.io.tmpdir"))
|
(def tmp-dir (System/getProperty "java.io.tmpdir"))
|
||||||
|
|
||||||
(defn m2-dir [n v]
|
(defn m2-dir
|
||||||
(io/file local-repo
|
([n]
|
||||||
(if (string? n) n (or (namespace n) (name n))) (name n) v))
|
(let [group (-> (if (string? n) n (or (namespace n) (name n)))
|
||||||
|
(str/replace "." "/"))]
|
||||||
|
(io/file local-repo group (name n))))
|
||||||
|
([n v]
|
||||||
|
(io/file (m2-dir n) v)))
|
||||||
|
|
||||||
(defn m2-file [n v classifier]
|
(defn m2-file [n v classifier]
|
||||||
(io/file (m2-dir n v) (str (name n) "-" v "-" classifier ".jar")))
|
(io/file (m2-dir n v) (str (name n) "-" v "-" classifier ".jar")))
|
||||||
|
|
|
@ -8,11 +8,15 @@
|
||||||
[ring/ring "1.0.0"]
|
[ring/ring "1.0.0"]
|
||||||
[ring/ring-codec "1.0.1"]
|
[ring/ring-codec "1.0.1"]
|
||||||
[commons-math/commons-math "1.2" :classifier "sources"]
|
[commons-math/commons-math "1.2" :classifier "sources"]
|
||||||
[ring/ring-defaults "0.2.1"]]
|
[ring/ring-defaults "0.2.1"]
|
||||||
|
[org.clojure/tools.reader "1.0.0-beta3"]]
|
||||||
|
|
||||||
:dependencies [[org.clojure/clojure]
|
:dependencies [[org.clojure/clojure]
|
||||||
[rome/rome nil]
|
[rome/rome nil]
|
||||||
[ring]
|
[ring]
|
||||||
[ring/ring-codec nil :exclusions [commons-codec]]
|
[ring/ring-codec nil :exclusions [commons-codec]]
|
||||||
[commons-codec "1.6"]
|
[commons-codec "1.6"]
|
||||||
[commons-math nil :classifier "sources"]])
|
[commons-math nil :classifier "sources"]
|
||||||
|
[org.clojure/tools.emitter.jvm "0.1.0-beta5"] ; depends on tools.reader 0.8.5
|
||||||
|
[org.clojure/tools.namespace "0.3.0-alpha3"] ; depends on tools.reader 0.10.0
|
||||||
|
])
|
||||||
|
|
Loading…
Reference in a new issue