From 1f0d223c1de438071645c7788174fb708ca55043 Mon Sep 17 00:00:00 2001 From: Guillaume R Date: Wed, 24 Jul 2019 02:10:00 +0200 Subject: Ease the declaration of optional dependencies + handle them in maven and ivy publications (#661) * Add Dep.optional() to fix #603 * Publish optional dependencies as such --- scalalib/src/Dep.scala | 3 +++ scalalib/src/publish/Ivy.scala | 17 ++++++++++------- scalalib/src/publish/Pom.scala | 5 +++++ scalalib/src/publish/settings.scala | 4 +++- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/scalalib/src/Dep.scala b/scalalib/src/Dep.scala index 59c3be5e..a6c77bfc 100644 --- a/scalalib/src/Dep.scala +++ b/scalalib/src/Dep.scala @@ -31,6 +31,9 @@ case class Dep(dep: coursier.Dependency, cross: CrossVersion, force: Boolean) { def withConfiguration(configuration: String): Dep = copy( dep = dep.copy(configuration = coursier.core.Configuration(configuration)) ) + def optional(optional: Boolean = true): Dep = copy( + dep = dep.copy(optional = optional) + ) /** * If scalaVersion is a Dotty version, replace the cross-version suffix diff --git a/scalalib/src/publish/Ivy.scala b/scalalib/src/publish/Ivy.scala index e06efadd..1f5c8152 100644 --- a/scalalib/src/publish/Ivy.scala +++ b/scalalib/src/publish/Ivy.scala @@ -42,18 +42,21 @@ object Ivy { private def renderDependency(dep: Dependency) = { if (dep.exclusions.isEmpty) - ${dep.configuration.getOrElse("default(compile)")}"} /> + ${dep.configuration.getOrElse("default(compile)")}"} /> else - ${dep.configuration.getOrElse("default(compile)")}"}> + ${dep.configuration.getOrElse("default(compile)")}"}> {dep.exclusions.map(ex => )} } - private def scopeToConf(s: Scope): String = s match { - case Scope.Compile => "compile" - case Scope.Provided => "provided" - case Scope.Test => "test" - case Scope.Runtime => "runtime" + private def depIvyConf(d: Dependency): String = { + if (d.optional) "optional" + else d.scope match { + case Scope.Compile => "compile" + case Scope.Provided => "provided" + case Scope.Test => "test" + case Scope.Runtime => "runtime" + } } } diff --git a/scalalib/src/publish/Pom.scala b/scalalib/src/publish/Pom.scala index a7f1f6fc..afa9d69e 100644 --- a/scalalib/src/publish/Pom.scala +++ b/scalalib/src/publish/Pom.scala @@ -90,12 +90,16 @@ object Pom { case Scope.Test => test case Scope.Runtime => runtime } + + val optional = if (d.optional) true else NodeSeq.Empty + if (d.exclusions.isEmpty) {d.artifact.group} {d.artifact.id} {d.artifact.version} {scope} + {optional} else @@ -111,6 +115,7 @@ object Pom { )} {scope} + {optional} } diff --git a/scalalib/src/publish/settings.scala b/scalalib/src/publish/settings.scala index d2801752..d17b8e4a 100644 --- a/scalalib/src/publish/settings.scala +++ b/scalalib/src/publish/settings.scala @@ -28,7 +28,8 @@ object Artifact { dep.dep.version ), Scope.Compile, - if (dep.dep.configuration == "") None else Some(dep.dep.configuration.value), + dep.dep.optional, + if (dep.dep.configuration.isEmpty) None else Some(dep.dep.configuration.value), dep.dep.exclusions.toList.map{case (a, b) => (a.value, b.value)} ) } @@ -45,6 +46,7 @@ object Scope { case class Dependency( artifact: Artifact, scope: Scope, + optional: Boolean = false, configuration: Option[String] = None, exclusions: Seq[(String, String)] = Nil ) -- cgit v1.2.3