Skip to content

Commit dcf2d3c

Browse files
committed
in tools build guide, delay basis creation which has side effects, closes #680
1 parent 70b00b3 commit dcf2d3c

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

content/guides/tools_build.adoc

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ The remainder of this guide demonstrates individual common use cases and how to
5757

5858
The most common Clojure build creates a jar file containing Clojure source code. To do this with tools.build we'll use the following tasks:
5959

60-
* `create-basis` - to create a project basis
60+
* `create-basis` - to create a project basis (note: this will download deps as a side effect)
6161
* `copy-dir` - to copy Clojure source and resources into a working dir
6262
* `write-pom` - to write a pom file in the working dir
6363
* `jar` - to jar up the working dir into a jar file
@@ -72,17 +72,19 @@ The build.clj will look like this:
7272
(def lib 'my/lib1)
7373
(def version (format "1.2.%s" (b/git-count-revs nil)))
7474
(def class-dir "target/classes")
75-
(def basis (b/create-basis {:project "deps.edn"}))
7675
(def jar-file (format "target/%s-%s.jar" (name lib) version))
7776
77+
;; delay to defer side effects (artifact downloads)
78+
(def basis (delay (b/create-basis {:project "deps.edn"})))
79+
7880
(defn clean [_]
7981
(b/delete {:path "target"}))
8082
8183
(defn jar [_]
8284
(b/write-pom {:class-dir class-dir
8385
:lib lib
8486
:version version
85-
:basis basis
87+
:basis @basis
8688
:src-dirs ["src"]})
8789
(b/copy-dir {:src-dirs ["src" "resources"]
8890
:target-dir class-dir})
@@ -148,23 +150,25 @@ An example build for a compiled uberjar will look like this:
148150
(def lib 'my/lib1)
149151
(def version (format "1.2.%s" (b/git-count-revs nil)))
150152
(def class-dir "target/classes")
151-
(def basis (b/create-basis {:project "deps.edn"}))
152153
(def uber-file (format "target/%s-%s-standalone.jar" (name lib) version))
153154
155+
;; delay to defer side effects (artifact downloads)
156+
(def basis (delay (b/create-basis {:project "deps.edn"})))
157+
154158
(defn clean [_]
155159
(b/delete {:path "target"}))
156160
157161
(defn uber [_]
158162
(clean nil)
159163
(b/copy-dir {:src-dirs ["src" "resources"]
160164
:target-dir class-dir})
161-
(b/compile-clj {:basis basis
165+
(b/compile-clj {:basis @basis
162166
:ns-compile '[my.lib.main]
163167
:class-dir class-dir})
164168
(b/uber {:class-dir class-dir
165169
:uber-file uber-file
166-
:basis basis
167-
:main 'my.lib.main}))
170+
:basis @basis
171+
:main 'my.lib.main})))
168172
----
169173

170174
This example directs `compile-clj` to compile the main namespace (by default source will be loaded from the basis :paths). Compilation is transitive and all namespaces loaded by the compiled namespace will also be compiled. You may need to add additional namespaces if code is dynamically or optionally loaded.
@@ -199,10 +203,12 @@ For example, consider a parameterization that includes an extra set of dev resou
199203
(def lib 'my/lib1)
200204
(def version (format "1.2.%s" (b/git-count-revs nil)))
201205
(def class-dir "target/classes")
202-
(def basis (b/create-basis {:project "deps.edn"}))
203206
(def jar-file (format "target/%s-%s.jar" (name lib) version))
204207
(def copy-srcs ["src" "resources"])
205208
209+
;; delay to defer side effects (artifact downloads)
210+
(def basis (delay (b/create-basis {:project "deps.edn"})))
211+
206212
(defn clean [params]
207213
(b/delete {:path "target"})
208214
params)
@@ -212,7 +218,7 @@ For example, consider a parameterization that includes an extra set of dev resou
212218
(b/write-pom {:class-dir class-dir
213219
:lib lib
214220
:version version
215-
:basis basis
221+
:basis @basis
216222
:src-dirs ["src"]})
217223
(b/copy-dir {:src-dirs srcs
218224
:target-dir class-dir})
@@ -246,24 +252,26 @@ This build creates a jar with classes compiled from Java sources and your Clojur
246252
(def lib 'my/lib1)
247253
(def version (format "1.2.%s" (b/git-count-revs nil)))
248254
(def class-dir "target/classes")
249-
(def basis (b/create-basis {:project "deps.edn"}))
250255
(def jar-file (format "target/%s-%s.jar" (name lib) version))
251256
257+
;; delay to defer side effects (artifact downloads)
258+
(def basis (delay (b/create-basis {:project "deps.edn"})))
259+
252260
(defn clean [_]
253261
(b/delete {:path "target"}))
254262
255263
(defn compile [_]
256264
(b/javac {:src-dirs ["java"]
257265
:class-dir class-dir
258-
:basis basis
266+
:basis @basis
259267
:javac-opts ["--release" "11"]}))
260268
261269
(defn jar [_]
262270
(compile nil)
263271
(b/write-pom {:class-dir class-dir
264272
:lib lib
265273
:version version
266-
:basis basis
274+
:basis @basis
267275
:src-dirs ["src"]})
268276
(b/copy-dir {:src-dirs ["src" "resources"]
269277
:target-dir class-dir})

0 commit comments

Comments
 (0)