Codebase list leiningen-clojure / 7ea847d
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
4 changed file(s) with 44 addition(s) and 19 deletion(s). Raw diff Collapse all Expand all
2222
2323 1. It does not actually introduce any dependencies to your project. It only says,
2424 "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."
2627 2. It allows the version number to be omitted from the `:dependencies` section,
2728 for any artifact that you've listed in your `:managed-dependencies` section.
2829
2930 Here's an example:
3031
31 ```clojure
32 ```clj
3233 (defproject superfun/happyslide "1.0.0-SNAPSHOT"
3334 :description "A Clojure project with managed dependencies"
3435 :min-lein-version "2.7.0"
5859 will allow you to define a single "parent" project that is inherited by multiple
5960 "child" projects; e.g.:
6061
61 ```
62 ```clj
6263 (defproject superfun/myparent "1.0.0"
6364 :managed-dependencies [[clj-time "0.12.0"]
6465 [me.raynes/fs "1.4.6"]
157157 (:dependencies managed-deps-project)
158158 (:managed-dependencies managed-deps-project)))
159159 ;; 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))
164167 ;; deps that have classifiers
165168 classified-deps (filter
166169 #(some #{:classifier} %)
167170 merged-deps)]
168171 ;; make sure the sample data has some unmanaged deps, some unused managed deps,
169172 ;; 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))
173176 ;; delete all of the existing artifacts for merged deps
174177 (doseq [[n v] merged-deps]
175178 (delete-file-recursively (m2-dir n v) :silently))
176179 ;; delete all of the artifacts for the managed deps too
177180 (doseq [[n v] managed-deps]
178181 (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)
179185 (deps managed-deps-project)
180186 ;; artifacts should be available for all merged deps
181187 (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) "').")))
183189 ;; artifacts should *not* have been downloaded for unused managed deps
184190 (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) "').")))
186192 ;; artifacts with classifiers should be available
187193 (doseq [[n v _ classifier] classified-deps]
188194 (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)))))))
11 (:require [leiningen.core.project :as project]
22 [leiningen.core.user :as user]
33 [leiningen.core.test.helper :as helper]
4 [clojure.java.io :as io])
4 [clojure.java.io :as io]
5 [clojure.string :as str])
56 (:import (java.io ByteArrayOutputStream PrintStream FileDescriptor
67 FileOutputStream)))
78
1011
1112 (def tmp-dir (System/getProperty "java.io.tmpdir"))
1213
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)))
1621
1722 (defn m2-file [n v classifier]
1823 (io/file (m2-dir n v) (str (name n) "-" v "-" classifier ".jar")))
77 [ring/ring "1.0.0"]
88 [ring/ring-codec "1.0.1"]
99 [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"]]
1112
1213 :dependencies [[org.clojure/clojure]
1314 [rome/rome nil]
1415 [ring]
1516 [ring/ring-codec nil :exclusions [commons-codec]]
1617 [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 ])