Skip to content

Commit b3e2d1b

Browse files
Break the dependency between repositoriesTask and ivyDeps
mill-scalablytyped (but possibly other plugins or user setups too) adds a dependency on `repositoriesTask` from `ivyDeps`. Since the introduction of `JavaModule#coursierProject`, Mill had a dependency the other way around, `repositoriesTask` depends on `ivyDeps`. This creates a cycle, leading to StackOverflowException-s. In order to work around that, this PR splits both `repositoriesTask` and `defaultResolver`, adding: - `allRepositoriesTask`: basically `repositoriesTask`, with the Mill internal repository added - `internalResolver`: same as `defaultResolver`, with the Mill internal repository added (via `allRepositoriesTask`) If users need to resolve purely external modules (most common case it seems), they can keep using `repositoriesTask` or `defaultResolver`. If they need to resolve some Mill internal modules (usually brought in via `JavaModule#coursierDependency`), they now need to use `allRepositoriesTask` and `internalResolver` instead of `repositoriesTask` and `defaultResolver`. That way, no cycle is introduced when users only need to resolve external modules. Fixes com-lihaoyi#4457
1 parent c05e81b commit b3e2d1b

File tree

6 files changed

+58
-12
lines changed

6 files changed

+58
-12
lines changed

Diff for: bsp/worker/src/mill/bsp/worker/MillBuildServer.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -296,15 +296,15 @@ private class MillBuildServer(
296296
case m: JavaModule =>
297297
Task.Anon {
298298
(
299-
m.defaultResolver().resolveDeps(
299+
m.internalResolver().resolveDeps(
300300
Seq(
301301
m.coursierDependency.withConfiguration(coursier.core.Configuration.provided),
302302
m.coursierDependency
303303
),
304304
sources = true
305305
),
306306
m.unmanagedClasspath(),
307-
m.repositoriesTask()
307+
m.allRepositoriesTask()
308308
)
309309
}
310310
}

Diff for: contrib/bloop/src/mill/contrib/bloop/BloopImpl.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ class BloopImpl(evs: () => Seq[Evaluator], wd: os.Path) extends ExternalModule {
390390
}
391391

392392
val bloopResolution: Task[BloopConfig.Resolution] = Task.Anon {
393-
val repos = module.repositoriesTask()
393+
val repos = module.allRepositoriesTask()
394394
// same as input of resolvedIvyDeps
395395
val coursierDeps = Seq(
396396
module.coursierDependency.withConfiguration(coursier.core.Configuration.provided),

Diff for: contrib/scalapblib/src/mill/contrib/scalapblib/ScalaPBModule.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ trait ScalaPBModule extends ScalaModule {
9191
}
9292

9393
def scalaPBProtoClasspath: T[Agg[PathRef]] = Task {
94-
defaultResolver().resolveDeps(
94+
internalResolver().resolveDeps(
9595
Seq(
9696
coursierDependency.withConfiguration(coursier.core.Configuration.provided),
9797
coursierDependency

Diff for: idea/src/mill/idea/GenIdeaImpl.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ case class GenIdeaImpl(
114114
GenIdeaException(
115115
s"Failure during resolving repositories: ${Evaluator.formatFailing(r)}"
116116
)
117-
)(modules.map(_._2.repositoriesTask))
117+
)(modules.map(_._2.allRepositoriesTask))
118118
}
119119
Lib.resolveMillBuildDeps(moduleRepos.flatten, Option(ctx), useSources = true)
120120
Lib.resolveMillBuildDeps(moduleRepos.flatten, Option(ctx), useSources = false)

Diff for: scalalib/src/mill/scalalib/CoursierModule.scala

+47-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,34 @@ trait CoursierModule extends mill.Module {
3333
Lib.depToDependencyJava(_: Dep)
3434
}
3535

36+
/**
37+
* A `CoursierModule.Resolver` to resolve dependencies.
38+
*
39+
* Unlike `defaultResolver`, this resolver can resolve Mill internal modules
40+
* (obtained via `JavaModule#coursierDependency`).
41+
*
42+
* @return `CoursierModule.Resolver` instance
43+
*/
44+
def internalResolver: Task[CoursierModule.Resolver] = Task.Anon {
45+
new CoursierModule.Resolver(
46+
repositories = allRepositoriesTask(),
47+
bind = bindDependency(),
48+
mapDependencies = Some(mapDependencies()),
49+
customizer = resolutionCustomizer(),
50+
coursierCacheCustomizer = coursierCacheCustomizer(),
51+
ctx = Some(implicitly[mill.api.Ctx.Log]),
52+
resolutionParams = resolutionParams()
53+
)
54+
}
55+
56+
/**
57+
* A `CoursierModule.Resolver` to resolve dependencies.
58+
*
59+
* Can be used to resolve external dependencies, if you need to download an external
60+
* tool from Maven or Ivy repositories, by calling `CoursierModule.Resolver#resolveDeps`.
61+
*
62+
* @return `CoursierModule.Resolver` instance
63+
*/
3664
def defaultResolver: Task[CoursierModule.Resolver] = Task.Anon {
3765
new CoursierModule.Resolver(
3866
repositories = repositoriesTask(),
@@ -94,14 +122,32 @@ trait CoursierModule extends mill.Module {
94122

95123
/**
96124
* The repositories used to resolved dependencies with [[resolveDeps()]].
125+
*
126+
* See [[allRepositoriesTask]] if you need to resolve Mill internal modules.
97127
*/
98128
def repositoriesTask: Task[Seq[Repository]] = Task.Anon {
99129
val resolve = Resolve()
100130
val repos = Await.result(
101131
resolve.finalRepositories.future()(resolve.cache.ec),
102132
Duration.Inf
103133
)
104-
internalRepositories() ++ repos
134+
repos
135+
}
136+
137+
/**
138+
* The repositories used to resolved dependencies
139+
*
140+
* Unlike [[repositoriesTask]], this includes the Mill internal repositories,
141+
* which allow to resolve Mill internal modules (usually brought in via
142+
* `JavaModule#coursierDependency`).
143+
*
144+
* Beware that this needs to evaluate `JavaModule#coursierProject` of all
145+
* module dependencies of the current module, which itself evaluates `JavaModule#ivyDeps`
146+
* and related tasks. You shouldn't depend on this task from implementations of `ivyDeps`,
147+
* which would introduce cycles between Mill tasks.
148+
*/
149+
def allRepositoriesTask: Task[Seq[Repository]] = Task.Anon {
150+
internalRepositories() ++ repositoriesTask()
105151
}
106152

107153
/**

Diff for: scalalib/src/mill/scalalib/JavaModule.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ trait JavaModule
4949
override def resources = super[JavaModule].resources
5050
override def moduleDeps: Seq[JavaModule] = Seq(outer)
5151
override def repositoriesTask: Task[Seq[Repository]] = Task.Anon {
52-
internalRepositories() ++ outer.repositoriesTask()
52+
outer.repositoriesTask()
5353
}
5454
override def resolutionCustomizer: Task[Option[coursier.Resolution => coursier.Resolution]] =
5555
outer.resolutionCustomizer
@@ -1002,7 +1002,7 @@ trait JavaModule
10021002
* Resolved dependencies
10031003
*/
10041004
def resolvedIvyDeps: T[Agg[PathRef]] = Task {
1005-
defaultResolver().resolveDeps(
1005+
internalResolver().resolveDeps(
10061006
Seq(
10071007
BoundDep(
10081008
coursierDependency.withConfiguration(cs.Configuration.provided),
@@ -1025,7 +1025,7 @@ trait JavaModule
10251025
}
10261026

10271027
def resolvedRunIvyDeps: T[Agg[PathRef]] = Task {
1028-
defaultResolver().resolveDeps(
1028+
internalResolver().resolveDeps(
10291029
Seq(
10301030
BoundDep(
10311031
coursierDependency.withConfiguration(cs.Configuration.runtime),
@@ -1223,7 +1223,7 @@ trait JavaModule
12231223
val dependencies =
12241224
(additionalDeps() ++ Seq(BoundDep(coursierDependency, force = false))).iterator.to(Seq)
12251225
val resolution: Resolution = Lib.resolveDependenciesMetadataSafe(
1226-
repositoriesTask(),
1226+
allRepositoriesTask(),
12271227
dependencies,
12281228
Some(mapDependencies()),
12291229
customizer = resolutionCustomizer(),
@@ -1466,7 +1466,7 @@ trait JavaModule
14661466
val tasks =
14671467
if (all.value) Seq(
14681468
Task.Anon {
1469-
defaultResolver().resolveDeps(
1469+
internalResolver().resolveDeps(
14701470
Seq(
14711471
coursierDependency.withConfiguration(cs.Configuration.provided),
14721472
coursierDependency
@@ -1479,7 +1479,7 @@ trait JavaModule
14791479
)
14801480
},
14811481
Task.Anon {
1482-
defaultResolver().resolveDeps(
1482+
internalResolver().resolveDeps(
14831483
Seq(coursierDependency.withConfiguration(cs.Configuration.runtime)),
14841484
sources = true
14851485
)

0 commit comments

Comments
 (0)