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`.
Chris Price
7 years ago
22 | 22 | |
23 | 23 | 1. It does not actually introduce any dependencies to your project. It only says, |
24 | 24 | "hey leiningen, if you encounter one of these dependencies later, here are the |
25 | versions that you should use." | |
25 | versions that you should fall back to if the version numbers aren't explicitly | |
26 | specified." | |
26 | 27 | 2. It allows the version number to be omitted from the `:dependencies` section, |
27 | 28 | for any artifact that you've listed in your `:managed-dependencies` section. |
28 | 29 | |
29 | 30 | Here's an example: |
30 | 31 | |
31 | ```clojure | |
32 | ```clj | |
32 | 33 | (defproject superfun/happyslide "1.0.0-SNAPSHOT" |
33 | 34 | :description "A Clojure project with managed dependencies" |
34 | 35 | :min-lein-version "2.7.0" |
58 | 59 | will allow you to define a single "parent" project that is inherited by multiple |
59 | 60 | "child" projects; e.g.: |
60 | 61 | |
61 | ``` | |
62 | ```clj | |
62 | 63 | (defproject superfun/myparent "1.0.0" |
63 | 64 | :managed-dependencies [[clj-time "0.12.0"] |
64 | 65 | [me.raynes/fs "1.4.6"] |
157 | 157 | (:dependencies managed-deps-project) |
158 | 158 | (:managed-dependencies managed-deps-project))) |
159 | 159 | ;; the list of deps from the managed deps section that aren't used |
160 | unused-managed-deps (remove | |
161 | (fn [dep] | |
162 | (some (partial coordinates-match? dep) merged-deps)) | |
163 | managed-deps) | |
160 | unused-managed-deps (-> (remove | |
161 | (fn [dep] | |
162 | (or (some (partial coordinates-match? dep) merged-deps) | |
163 | ;; special-casing to remove tools.reader, which is a common transitive dep | |
164 | ;; of two of our normal dependencies | |
165 | (= 'org.clojure/tools.reader (first dep)))) | |
166 | managed-deps)) | |
164 | 167 | ;; deps that have classifiers |
165 | 168 | classified-deps (filter |
166 | 169 | #(some #{:classifier} %) |
167 | 170 | merged-deps)] |
168 | 171 | ;; make sure the sample data has some unmanaged deps, some unused managed deps, |
169 | 172 | ;; and some classified deps, for completeness |
170 | (is (not (empty? versioned-unmanaged-deps))) | |
171 | (is (not (empty? unused-managed-deps))) | |
172 | (is (not (empty? classified-deps))) | |
173 | (is (seq versioned-unmanaged-deps)) | |
174 | (is (seq unused-managed-deps)) | |
175 | (is (seq classified-deps)) | |
173 | 176 | ;; delete all of the existing artifacts for merged deps |
174 | 177 | (doseq [[n v] merged-deps] |
175 | 178 | (delete-file-recursively (m2-dir n v) :silently)) |
176 | 179 | ;; delete all of the artifacts for the managed deps too |
177 | 180 | (doseq [[n v] managed-deps] |
178 | 181 | (delete-file-recursively (m2-dir n v) :silently)) |
182 | ;; delete all copies of tools.reader so we know that the managed dependency | |
183 | ;; for it is taking precedence | |
184 | (delete-file-recursively (m2-dir 'org.clojure/tools.reader) :silently) | |
179 | 185 | (deps managed-deps-project) |
180 | 186 | ;; artifacts should be available for all merged deps |
181 | 187 | (doseq [[n v] merged-deps] |
182 | (is (.exists (m2-dir n v)) (str n " was not downloaded."))) | |
188 | (is (.exists (m2-dir n v)) (str n " was not downloaded (missing dir '" (m2-dir n v) "')."))) | |
183 | 189 | ;; artifacts should *not* have been downloaded for unused managed deps |
184 | 190 | (doseq [[n v] unused-managed-deps] |
185 | (is (not (.exists (m2-dir n v))) (str n " was unexpectedly downloaded."))) | |
191 | (is (not (.exists (m2-dir n v))) (str n " was unexpectedly downloaded (found unexpected dir '" (m2-dir n v) "')."))) | |
186 | 192 | ;; artifacts with classifiers should be available |
187 | 193 | (doseq [[n v _ classifier] classified-deps] |
188 | 194 | (let [f (m2-file n v classifier)] |
189 | (is (.exists f) (str f " was not downloaded.")))))) | |
195 | (is (.exists f) (str f " was not downloaded.")))) | |
196 | ;; check tools.reader explicitly, since it is our special transitive dependency | |
197 | (let [tools-reader-versions (into [] (.listFiles (m2-dir 'org.clojure/tools.reader)))] | |
198 | (is (= 1 (count tools-reader-versions))) | |
199 | (is (= (first tools-reader-versions) (m2-dir 'org.clojure/tools.reader | |
200 | (->> managed-deps | |
201 | (filter | |
202 | (fn [dep] (= 'org.clojure/tools.reader (first dep)))) | |
203 | first | |
204 | second))))))) |
1 | 1 | (:require [leiningen.core.project :as project] |
2 | 2 | [leiningen.core.user :as user] |
3 | 3 | [leiningen.core.test.helper :as helper] |
4 | [clojure.java.io :as io]) | |
4 | [clojure.java.io :as io] | |
5 | [clojure.string :as str]) | |
5 | 6 | (:import (java.io ByteArrayOutputStream PrintStream FileDescriptor |
6 | 7 | FileOutputStream))) |
7 | 8 | |
10 | 11 | |
11 | 12 | (def tmp-dir (System/getProperty "java.io.tmpdir")) |
12 | 13 | |
13 | (defn m2-dir [n v] | |
14 | (io/file local-repo | |
15 | (if (string? n) n (or (namespace n) (name n))) (name n) v)) | |
14 | (defn m2-dir | |
15 | ([n] | |
16 | (let [group (-> (if (string? n) n (or (namespace n) (name n))) | |
17 | (str/replace "." "/"))] | |
18 | (io/file local-repo group (name n)))) | |
19 | ([n v] | |
20 | (io/file (m2-dir n) v))) | |
16 | 21 | |
17 | 22 | (defn m2-file [n v classifier] |
18 | 23 | (io/file (m2-dir n v) (str (name n) "-" v "-" classifier ".jar"))) |
7 | 7 | [ring/ring "1.0.0"] |
8 | 8 | [ring/ring-codec "1.0.1"] |
9 | 9 | [commons-math/commons-math "1.2" :classifier "sources"] |
10 | [ring/ring-defaults "0.2.1"]] | |
10 | [ring/ring-defaults "0.2.1"] | |
11 | [org.clojure/tools.reader "1.0.0-beta3"]] | |
11 | 12 | |
12 | 13 | :dependencies [[org.clojure/clojure] |
13 | 14 | [rome/rome nil] |
14 | 15 | [ring] |
15 | 16 | [ring/ring-codec nil :exclusions [commons-codec]] |
16 | 17 | [commons-codec "1.6"] |
17 | [commons-math nil :classifier "sources"]]) | |
18 | [commons-math nil :classifier "sources"] | |
19 | [org.clojure/tools.emitter.jvm "0.1.0-beta5"] ; depends on tools.reader 0.8.5 | |
20 | [org.clojure/tools.namespace "0.3.0-alpha3"] ; depends on tools.reader 0.10.0 | |
21 | ]) |