sbt/plugin/src/main/scala/coursier/Tasks.scala

70 lines
2.0 KiB
Scala

package coursier
import sbt.{Classpaths, Resolver, Def}
import Structure._
import Keys._
import sbt.Keys._
object Tasks {
def coursierResolversTask: Def.Initialize[sbt.Task[Seq[Resolver]]] = Def.task {
var l = externalResolvers.value
if (sbtPlugin.value)
l = Seq(
sbtResolver.value,
Classpaths.sbtPluginReleases
) ++ l
l
}
def coursierProjectTask: Def.Initialize[sbt.Task[(Project, Seq[(String, Seq[Artifact])])]] =
(
sbt.Keys.state,
sbt.Keys.thisProjectRef
).flatMap { (state, projectRef) =>
// should projectID.configurations be used instead?
val configurations = ivyConfigurations.in(projectRef).get(state)
// exportedProducts looks like what we want, but depends on the update task, which
// make the whole thing run into cycles...
val artifacts = configurations.map { cfg =>
cfg.name -> Option(classDirectory.in(projectRef).in(cfg).getOrElse(state, null))
}.collect { case (name, Some(classDir)) =>
name -> Seq(
Artifact(
classDir.toURI.toString,
Map.empty,
Map.empty,
Attributes(),
changing = true
)
)
}
val allDependenciesTask = allDependencies.in(projectRef).get(state)
for {
allDependencies <- allDependenciesTask
} yield {
val proj = FromSbt.project(
projectID.in(projectRef).get(state),
allDependencies,
configurations.map { cfg => cfg.name -> cfg.extendsConfigs.map(_.name) }.toMap,
scalaVersion.in(projectRef).get(state),
scalaBinaryVersion.in(projectRef).get(state)
)
(proj, artifacts)
}
}
def coursierProjectsTask: Def.Initialize[sbt.Task[Seq[(Project, Seq[(String, Seq[Artifact])])]]] =
sbt.Keys.state.flatMap { state =>
val projects = structure(state).allProjectRefs
coursierProject.forAllProjects(state, projects).map(_.values.toVector)
}
}