mirror of https://github.com/sbt/sbt.git
Preparing the ground for Ivy artifacts, and better artifact API
This commit is contained in:
parent
f99c880c16
commit
2d541093ff
|
|
@ -97,8 +97,12 @@ case class Coursier(scope: List[String],
|
|||
sys exit 1
|
||||
}
|
||||
|
||||
def repr(dep: Dependency) =
|
||||
s"${dep.module.organization}:${dep.module.name}:${dep.`type`}:${Some(dep.classifier).filter(_.nonEmpty).map(_+":").mkString}${dep.version}"
|
||||
def repr(dep: Dependency) = {
|
||||
val (type0, classifier) = dep.artifacts match {
|
||||
case maven: Artifacts.Maven => (maven.`type`, maven.classifier)
|
||||
}
|
||||
s"${dep.module.organization}:${dep.module.name}:$type0:${Some(classifier).filter(_.nonEmpty).map(_+":").mkString}${dep.version}"
|
||||
}
|
||||
|
||||
val trDeps = res.dependencies.toList.sortBy(repr)
|
||||
|
||||
|
|
|
|||
|
|
@ -21,15 +21,18 @@ case class ArtifactDownloader(root: String, cache: File, logger: Option[Artifact
|
|||
|
||||
def artifact(module: Module,
|
||||
version: String,
|
||||
classifier: String,
|
||||
`type`: String,
|
||||
artifacts: Artifacts,
|
||||
cachePolicy: CachePolicy): EitherT[Task, String, File] = {
|
||||
|
||||
val (type0, classifier) = artifacts match {
|
||||
case maven: Artifacts.Maven => (maven.`type`, maven.classifier)
|
||||
}
|
||||
|
||||
val relPath =
|
||||
module.organization.split('.').toSeq ++ Seq(
|
||||
module.name,
|
||||
version,
|
||||
s"${module.name}-$version${Some(classifier).filter(_.nonEmpty).map("-"+_).mkString}.${`type`}"
|
||||
s"${module.name}-$version${Some(classifier).filter(_.nonEmpty).map("-"+_).mkString}.$type0"
|
||||
)
|
||||
|
||||
val file = (cache /: relPath)(new File(_, _))
|
||||
|
|
@ -94,7 +97,7 @@ case class ArtifactDownloader(root: String, cache: File, logger: Option[Artifact
|
|||
|
||||
def artifact(dependency: Dependency,
|
||||
cachePolicy: CachePolicy = CachePolicy.Default): EitherT[Task, String, File] =
|
||||
artifact(dependency.module, dependency.version, dependency.classifier, dependency.`type`, cachePolicy = cachePolicy)
|
||||
artifact(dependency.module, dependency.version, dependency.artifacts, cachePolicy = cachePolicy)
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,13 +32,19 @@ sealed abstract class Scope(val name: String)
|
|||
case class Dependency(module: Module,
|
||||
version: String,
|
||||
scope: Scope,
|
||||
`type`: String,
|
||||
classifier: String,
|
||||
artifacts: Artifacts,
|
||||
exclusions: Set[(String, String)],
|
||||
optional: Boolean) {
|
||||
def moduleVersion = (module, version)
|
||||
}
|
||||
|
||||
sealed trait Artifacts
|
||||
|
||||
object Artifacts {
|
||||
case class Maven(`type`: String,
|
||||
classifier: String) extends Artifacts
|
||||
}
|
||||
|
||||
case class Project(module: Module,
|
||||
version: String,
|
||||
dependencies: Seq[Dependency],
|
||||
|
|
|
|||
|
|
@ -70,7 +70,9 @@ object Resolver {
|
|||
|
||||
type DepMgmtKey = (String, String, String)
|
||||
def dependencyManagementKey(dep: Dependency): DepMgmtKey =
|
||||
(dep.module.organization, dep.module.name, dep.`type`)
|
||||
dep.artifacts match {
|
||||
case Artifacts.Maven(type0, _) => (dep.module.organization, dep.module.name, type0)
|
||||
}
|
||||
def dependencyManagementAdd(m: Map[DepMgmtKey, Dependency], dep: Dependency): Map[DepMgmtKey, Dependency] = {
|
||||
val key = dependencyManagementKey(dep)
|
||||
if (m.contains(key)) m else m + (key -> dep)
|
||||
|
|
@ -119,7 +121,13 @@ object Resolver {
|
|||
name = substituteProps(dep.module.name)
|
||||
),
|
||||
version = substituteProps(dep.version),
|
||||
`type` = substituteProps(dep.`type`),
|
||||
artifacts = dep.artifacts match {
|
||||
case maven: Artifacts.Maven =>
|
||||
maven.copy(
|
||||
`type` = substituteProps(maven.`type`),
|
||||
classifier = substituteProps(maven.classifier)
|
||||
)
|
||||
},
|
||||
scope = Parse.scope(substituteProps(dep.scope.name)),
|
||||
exclusions = dep.exclusions
|
||||
.map{case (org, name) => (substituteProps(org), substituteProps(name))}
|
||||
|
|
|
|||
|
|
@ -85,8 +85,7 @@ object Xml {
|
|||
mod,
|
||||
version0,
|
||||
scopeOpt getOrElse defaultScope,
|
||||
typeOpt getOrElse defaultType,
|
||||
classifierOpt getOrElse defaultClassifier,
|
||||
Artifacts.Maven(typeOpt getOrElse defaultType, classifierOpt getOrElse defaultClassifier),
|
||||
exclusions.map(mod => (mod.organization, mod.name)).toSet,
|
||||
optional
|
||||
)
|
||||
|
|
|
|||
|
|
@ -8,11 +8,20 @@ package object coursier {
|
|||
def apply(module: Module,
|
||||
version: String,
|
||||
scope: Scope = Scope.Other(""), // Substituted by Resolver with its own default scope (compile)
|
||||
`type`: String = "jar",
|
||||
classifier: String = "",
|
||||
artifacts: Artifacts = Artifacts.Maven(),
|
||||
exclusions: Set[(String, String)] = Set.empty,
|
||||
optional: Boolean = false): Dependency =
|
||||
core.Dependency(module, version, scope, `type`, classifier, exclusions, optional)
|
||||
core.Dependency(module, version, scope, artifacts, exclusions, optional)
|
||||
}
|
||||
|
||||
type Artifacts = core.Artifacts
|
||||
object Artifacts {
|
||||
type Maven = core.Artifacts.Maven
|
||||
object Maven {
|
||||
def apply(`type`: String = "jar",
|
||||
classifier: String = ""): Maven =
|
||||
core.Artifacts.Maven(`type`, classifier)
|
||||
}
|
||||
}
|
||||
|
||||
type Project = core.Project
|
||||
|
|
|
|||
|
|
@ -12,8 +12,12 @@ object CentralTests extends TestSuite {
|
|||
repository.mavenCentral
|
||||
)
|
||||
|
||||
def repr(dep: Dependency) =
|
||||
s"${dep.module.organization}:${dep.module.name}:${dep.`type`}:${Some(dep.classifier).filter(_.nonEmpty).map(_+":").mkString}${dep.version}"
|
||||
def repr(dep: Dependency) = {
|
||||
val (type0, classifier) = dep.artifacts match {
|
||||
case maven: Artifacts.Maven => (maven.`type`, maven.classifier)
|
||||
}
|
||||
s"${dep.module.organization}:${dep.module.name}:$type0:${Some(classifier).filter(_.nonEmpty).map(_+":").mkString}${dep.version}"
|
||||
}
|
||||
|
||||
def resolutionCheck(module: Module, version: String) =
|
||||
async {
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ object PomParsingTests extends TestSuite {
|
|||
</dependency>
|
||||
"""
|
||||
|
||||
val expected = \/-(Dependency(Module("comp", "lib"), "2.1", classifier = "extra"))
|
||||
val expected = \/-(Dependency(Module("comp", "lib"), "2.1", artifacts = Artifacts.Maven(classifier = "extra")))
|
||||
|
||||
val result = Xml.dependency(xmlParse(depNode).right.get)
|
||||
|
||||
|
|
|
|||
|
|
@ -217,7 +217,11 @@ object App {
|
|||
label
|
||||
)
|
||||
|
||||
def depItem(dep: Dependency) =
|
||||
def depItem(dep: Dependency) = {
|
||||
val (type0, classifier) = dep.artifacts match {
|
||||
case maven: Artifacts.Maven => (maven.`type`, maven.classifier)
|
||||
}
|
||||
|
||||
<.tr(
|
||||
^.`class` := (if (res.errors.contains(dep.moduleVersion)) "danger" else ""),
|
||||
<.td(dep.module.organization),
|
||||
|
|
@ -225,8 +229,8 @@ object App {
|
|||
<.td(dep.version),
|
||||
<.td(Seq[Seq[TagMod]](
|
||||
if (dep.scope == Scope.Compile) Seq() else Seq(infoLabel(dep.scope.name)),
|
||||
if (dep.`type`.isEmpty || dep.`type` == "jar") Seq() else Seq(infoLabel(dep.`type`)),
|
||||
if (dep.classifier.isEmpty) Seq() else Seq(infoLabel(dep.classifier)),
|
||||
if (type0.isEmpty || type0 == "jar") Seq() else Seq(infoLabel(type0)),
|
||||
if (classifier.isEmpty) Seq() else Seq(infoLabel(classifier)),
|
||||
Some(dep.exclusions).filter(_.nonEmpty).map(excls => infoPopOver("Exclusions", excls.toList.sorted.map{case (org, name) => s"$org:$name"}.mkString("; "))).toSeq,
|
||||
if (dep.optional) Seq(infoLabel("optional")) else Seq(),
|
||||
res.errors.get(dep.moduleVersion).map(errs => errorPopOver("Error", errs.mkString("; "))).toSeq
|
||||
|
|
@ -255,6 +259,7 @@ object App {
|
|||
}
|
||||
))
|
||||
)
|
||||
}
|
||||
|
||||
val sortedDeps = res.dependencies.toList
|
||||
.sortBy(dep => coursier.core.Module.unapply(dep.module).get)
|
||||
|
|
|
|||
Loading…
Reference in New Issue