Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Coursier plugins via customizing FileCache used (with classloaders) #1760

Merged
merged 4 commits into from
Mar 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 63 additions & 8 deletions main/src/mill/modules/Jvm.scala
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,8 @@ object Jvm {
sources: Boolean = false,
mapDependencies: Option[Dependency => Dependency] = None,
customizer: Option[coursier.core.Resolution => coursier.core.Resolution] = None,
ctx: Option[mill.api.Ctx.Log] = None
ctx: Option[mill.api.Ctx.Log] = None,
coursierCacheCustomizer: Option[coursier.cache.FileCache[Task] => coursier.cache.FileCache[Task]] = None
): Result[Agg[PathRef]] = {

val (_, resolution) = resolveDependenciesMetadata(
Expand All @@ -543,7 +544,8 @@ object Jvm {
force,
mapDependencies,
customizer,
ctx
ctx,
coursierCacheCustomizer
)
val errs = resolution.errors

Expand All @@ -561,12 +563,15 @@ object Jvm {
Result.Failure(msg)
} else {

val coursierCache0 = coursier.cache.FileCache[Task].noCredentials
val coursierCache = coursierCacheCustomizer.getOrElse(identity[coursier.cache.FileCache[Task]](_)).apply(coursierCache0)

def load(artifacts: Seq[coursier.util.Artifact]) = {

import scala.concurrent.ExecutionContext.Implicits.global
val loadedArtifacts = Gather[Task].gather(
for (a <- artifacts)
yield coursier.cache.Cache.default.file(a).run.map(a.optional -> _)
yield coursierCache.file(a).run.map(a.optional -> _)
).unsafeRun

val errors = loadedArtifacts.collect {
Expand Down Expand Up @@ -611,7 +616,8 @@ object Jvm {
force: IterableOnce[coursier.Dependency],
mapDependencies: Option[Dependency => Dependency] = None,
customizer: Option[coursier.core.Resolution => coursier.core.Resolution] = None,
ctx: Option[mill.api.Ctx.Log] = None
ctx: Option[mill.api.Ctx.Log] = None,
coursierCacheCustomizer: Option[coursier.cache.FileCache[Task] => coursier.cache.FileCache[Task]] = None
): (Seq[Dependency], Resolution) = {

val cachePolicies = coursier.cache.CacheDefaults.cachePolicies
Expand All @@ -631,15 +637,16 @@ object Jvm {
val start = customizer.getOrElse(identity[Resolution](_)).apply(start0)

val resolutionLogger = ctx.map(c => new TickerResolutionLogger(c))
val cache = resolutionLogger match {
val coursierCache0 = resolutionLogger match {
case None => coursier.cache.FileCache[Task].withCachePolicies(cachePolicies)
case Some(l) =>
coursier.cache.FileCache[Task]
.withCachePolicies(cachePolicies)
.withLogger(l)
}
val coursierCache = coursierCacheCustomizer.getOrElse(identity[coursier.cache.FileCache[Task]](_)).apply(coursierCache0)

val fetches = cache.fetchs
val fetches = coursierCache.fetchs

val fetch = coursier.core.ResolutionProcess.fetch(repositories, fetches.head, fetches.tail)

Expand Down Expand Up @@ -762,6 +769,52 @@ object Jvm {
}
}

@deprecated(
"Use alternative overload. This one is only for binary backwards compatibility.",
"mill after 0.10.0"
)
def resolveDependencies(
repositories: Seq[Repository],
deps: IterableOnce[coursier.Dependency],
force: IterableOnce[coursier.Dependency],
sources: Boolean,
mapDependencies: Option[Dependency => Dependency],
customizer: Option[coursier.core.Resolution => coursier.core.Resolution],
ctx: Option[mill.api.Ctx.Log]
): Result[Agg[PathRef]] =
resolveDependencies(
repositories = repositories,
deps = deps,
force = force,
sources = sources,
mapDependencies = mapDependencies,
customizer = customizer,
ctx = ctx,
coursierCacheCustomizer = None
)

@deprecated(
"Use alternative overload. This one is only for binary backwards compatibility.",
"mill after 0.10.0"
)
def resolveDependenciesMetadata(
repositories: Seq[Repository],
deps: IterableOnce[coursier.Dependency],
force: IterableOnce[coursier.Dependency],
mapDependencies: Option[Dependency => Dependency],
customizer: Option[coursier.core.Resolution => coursier.core.Resolution],
ctx: Option[mill.api.Ctx.Log]
): (Seq[Dependency], Resolution) =
resolveDependenciesMetadata(
repositories = repositories,
deps = deps,
force = force,
mapDependencies = mapDependencies,
customizer = customizer,
ctx = ctx,
coursierCacheCustomizer = None
)

@deprecated(
"Use alternative overload. This one is only for binary backwards compatibility.",
"mill after 0.9.6"
Expand All @@ -781,7 +834,8 @@ object Jvm {
sources = sources,
mapDependencies = mapDependencies,
customizer = None,
ctx = ctx
ctx = ctx,
coursierCacheCustomizer = None
)

@deprecated(
Expand All @@ -801,7 +855,8 @@ object Jvm {
force = force,
mapDependencies = mapDependencies,
customizer = None,
ctx = ctx
ctx = ctx,
coursierCacheCustomizer = None
)

}
20 changes: 19 additions & 1 deletion scalalib/src/CoursierModule.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package mill.scalalib

import scala.annotation.nowarn
import coursier.cache.FileCache

import scala.annotation.nowarn
import coursier.{Dependency, Repository, Resolve}
import coursier.core.Resolution
import mill.{Agg, T}
Expand Down Expand Up @@ -35,6 +36,7 @@ trait CoursierModule extends mill.Module {
sources = sources,
mapDependencies = Some(mapDependencies()),
customizer = resolutionCustomizer(),
coursierCacheCustomizer = coursierCacheCustomizer(),
ctx = Some(implicitly[mill.api.Ctx.Log])
)
}
Expand Down Expand Up @@ -71,6 +73,22 @@ trait CoursierModule extends mill.Module {
*/
def resolutionCustomizer: Task[Option[Resolution => Resolution]] = T.task { None }

/**
* Customize the coursier file cache.
*
* This is rarely needed to be changed, but sometimes e.g you want to load a coursier plugin.
* Doing so requires adding to coursier's classpath. To do this you could use the following:
* {{{
* override def coursierCacheCustomizer = T.task {
* Some( (fc: coursier.cache.FileCache[Task]) =>
* fc.withClassLoaders(Seq(classOf[coursier.cache.protocol.S3Handler].getClassLoader))
* )
* }
* }}}
* @return
*/
def coursierCacheCustomizer: Task[Option[FileCache[coursier.util.Task] => FileCache[coursier.util.Task]]] = T.task { None }

/**
* The repositories used to resolved dependencies with [[resolveDeps()]].
*/
Expand Down
2 changes: 2 additions & 0 deletions scalalib/src/GenIdeaImpl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ case class GenIdeaImpl(
sources = false,
mapDependencies = None,
customizer = None,
coursierCacheCustomizer = None,
ctx = ctx
)

Expand All @@ -122,6 +123,7 @@ case class GenIdeaImpl(
sources = true,
mapDependencies = None,
customizer = None,
coursierCacheCustomizer = None,
ctx = ctx
)
}
Expand Down
3 changes: 2 additions & 1 deletion scalalib/src/JavaModule.scala
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,8 @@ trait JavaModule
resolveCoursierDependency().apply(_),
additionalDeps() ++ transitiveIvyDeps(),
Some(mapDependencies()),
customizer = resolutionCustomizer()
customizer = resolutionCustomizer(),
coursierCacheCustomizer = coursierCacheCustomizer(),
)

println(
Expand Down
65 changes: 59 additions & 6 deletions scalalib/src/Lib.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import java.lang.annotation.Annotation
import java.lang.reflect.Modifier
import java.util.zip.ZipInputStream

import coursier.util.Task
import coursier.{Dependency, Fetch, Repository, Resolution}
import mill.api.{Ctx, Loose, PathRef, Result}
import sbt.testing._
Expand All @@ -29,7 +30,8 @@ object Lib {
deps: IterableOnce[Dep],
mapDependencies: Option[Dependency => Dependency] = None,
customizer: Option[coursier.core.Resolution => coursier.core.Resolution] = None,
ctx: Option[Ctx.Log] = None
ctx: Option[Ctx.Log] = None,
coursierCacheCustomizer: Option[coursier.cache.FileCache[Task] => coursier.cache.FileCache[Task]] = None,
): (Seq[Dependency], Resolution) = {
val depSeq = deps.iterator.toSeq
mill.modules.Jvm.resolveDependenciesMetadata(
Expand All @@ -38,7 +40,8 @@ object Lib {
force = depSeq.filter(_.force).map(depToDependency),
mapDependencies = mapDependencies,
customizer = customizer,
ctx = ctx
ctx = ctx,
coursierCacheCustomizer = coursierCacheCustomizer
)
}

Expand All @@ -56,7 +59,8 @@ object Lib {
sources: Boolean = false,
mapDependencies: Option[Dependency => Dependency] = None,
customizer: Option[coursier.core.Resolution => coursier.core.Resolution] = None,
ctx: Option[Ctx.Log] = None
ctx: Option[Ctx.Log] = None,
coursierCacheCustomizer: Option[coursier.cache.FileCache[Task] => coursier.cache.FileCache[Task]] = None
): Result[Agg[PathRef]] = {
val depSeq = deps.iterator.toSeq
mill.modules.Jvm.resolveDependencies(
Expand All @@ -66,7 +70,8 @@ object Lib {
sources = sources,
mapDependencies = mapDependencies,
customizer = customizer,
ctx = ctx
ctx = ctx,
coursierCacheCustomizer = coursierCacheCustomizer
)
}

Expand Down Expand Up @@ -120,6 +125,52 @@ object Lib {
ivy"$scalaOrganization:scala-library:$scalaVersion".forceVersion()
)

@deprecated(
"User other overload instead. Only for binary backward compatibility.",
"mill after 0.10.0"
)
def resolveDependenciesMetadata(
repositories: Seq[Repository],
depToDependency: Dep => coursier.Dependency,
deps: IterableOnce[Dep],
mapDependencies: Option[Dependency => Dependency],
customizer: Option[coursier.core.Resolution => coursier.core.Resolution],
ctx: Option[Ctx.Log]
): (Seq[Dependency], Resolution) =
resolveDependenciesMetadata(
repositories = repositories,
depToDependency = depToDependency,
deps = deps,
mapDependencies = mapDependencies,
customizer = customizer,
ctx = ctx,
coursierCacheCustomizer = None
)

@deprecated(
"User other overload instead. Only for binary backward compatibility.",
"mill after 0.10.0"
)
def resolveDependencies(
repositories: Seq[Repository],
depToDependency: Dep => coursier.Dependency,
deps: IterableOnce[Dep],
sources: Boolean,
mapDependencies: Option[Dependency => Dependency],
customizer: Option[coursier.core.Resolution => coursier.core.Resolution],
ctx: Option[Ctx.Log]
): Result[Agg[PathRef]] =
resolveDependencies(
repositories = repositories,
depToDependency = depToDependency,
deps = deps,
sources = sources,
mapDependencies = mapDependencies,
customizer = customizer,
ctx = ctx,
coursierCacheCustomizer = None
)

@deprecated(
"User other overload instead. Only for binary backward compatibility.",
"mill after 0.9.6"
Expand All @@ -137,7 +188,8 @@ object Lib {
deps = deps,
mapDependencies = mapDependencies,
customizer = None,
ctx = ctx
ctx = ctx,
coursierCacheCustomizer = None
)

@deprecated(
Expand All @@ -159,7 +211,8 @@ object Lib {
sources = sources,
mapDependencies = mapDependencies,
customizer = None,
ctx = ctx
ctx = ctx,
coursierCacheCustomizer = None
)

def findSourceFiles(sources: Seq[PathRef], extensions: Seq[String]): Seq[os.Path] = {
Expand Down
2 changes: 2 additions & 0 deletions scalalib/src/dependency/versions/VersionsFinder.scala
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ private[dependency] object VersionsFinder {
val repos = javaModule.repositoriesTask()
val mapDeps = javaModule.mapDependencies()
val custom = javaModule.resolutionCustomizer()
val cacheCustom = javaModule.coursierCacheCustomizer()

val (dependencies, _) =
Lib.resolveDependenciesMetadata(
Expand All @@ -47,6 +48,7 @@ private[dependency] object VersionsFinder {
deps = deps ++ compileIvyDeps ++ runIvyDeps,
mapDependencies = Some(mapDeps),
customizer = custom,
coursierCacheCustomizer = cacheCustom,
ctx = Some(T.log)
)

Expand Down