summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume R <theelectronwill@gmail.com>2019-07-24 02:10:00 +0200
committerLi Haoyi <haoyi.sg@gmail.com>2019-07-24 08:10:00 +0800
commit1f0d223c1de438071645c7788174fb708ca55043 (patch)
tree9371d141c9a1ad3c50f7392055fed64d69f0e7e8
parentbf9648c08fc8fc0c50f46ff4147d6bfe7f432bcf (diff)
downloadmill-1f0d223c1de438071645c7788174fb708ca55043.tar.gz
mill-1f0d223c1de438071645c7788174fb708ca55043.tar.bz2
mill-1f0d223c1de438071645c7788174fb708ca55043.zip
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
-rw-r--r--scalalib/src/Dep.scala3
-rw-r--r--scalalib/src/publish/Ivy.scala17
-rw-r--r--scalalib/src/publish/Pom.scala5
-rw-r--r--scalalib/src/publish/settings.scala4
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)
- <dependency org={dep.artifact.group} name={dep.artifact.id} rev={dep.artifact.version} conf={s"${scopeToConf(dep.scope)}->${dep.configuration.getOrElse("default(compile)")}"} />
+ <dependency org={dep.artifact.group} name={dep.artifact.id} rev={dep.artifact.version} conf={s"${depIvyConf(dep)}->${dep.configuration.getOrElse("default(compile)")}"} />
else
- <dependency org={dep.artifact.group} name={dep.artifact.id} rev={dep.artifact.version} conf={s"${scopeToConf(dep.scope)}->${dep.configuration.getOrElse("default(compile)")}"}>
+ <dependency org={dep.artifact.group} name={dep.artifact.id} rev={dep.artifact.version} conf={s"${depIvyConf(dep)}->${dep.configuration.getOrElse("default(compile)")}"}>
{dep.exclusions.map(ex => <exclude org={ex._1} name={ex._2} matcher="exact"/>)}
</dependency>
}
- 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 => <scope>test</scope>
case Scope.Runtime => <scope>runtime</scope>
}
+
+ val optional = if (d.optional) <optional>true</optional> else NodeSeq.Empty
+
if (d.exclusions.isEmpty)
<dependency>
<groupId>{d.artifact.group}</groupId>
<artifactId>{d.artifact.id}</artifactId>
<version>{d.artifact.version}</version>
{scope}
+ {optional}
</dependency>
else
<dependency>
@@ -111,6 +115,7 @@ object Pom {
)}
</exclusions>
{scope}
+ {optional}
</dependency>
}
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
)