2015-01-08 5 views
9

Ich baue eine Dienstprogramm-Bibliothek, die zusammen mit einer der 1.0, 1.1, 1.2-Version von Apache Spark verwendet werden kann.sbt - bestimmte Abhängigkeit nur während der Veröffentlichung auszuschließen

Da sie alle binär abwärtskompatibel sind, möchte ich den Benutzer entscheiden lassen, welche Spark-Version zu verwenden (durch manuelle Zugabe spark-core mit bevorzugten Version als eine Abhängigkeit zusammen mit meiner Bibliothek), und keine Version auferlegen Einschränkung im POM der Bibliothek. Sonst verärgert es die Benutzer mit Abhängigkeitsverweigerungswarnungen.

Ist es möglich, sbt eine Bibliotheksabhängigkeit im veröffentlichten POM auszulassen, ohne das Kompilierungsverhalten zu ändern?

Antwort

5

Ja, die provided ist Konfiguration speziell dafür entworfen:

libraryDependencies += "org" %% "artifact" % "1.0" % "provided" 

wird Bibliothek auf dem Classpath während der Kompilierung sagte setzen, aber nicht in der POM-Datei.

+1

'provided' ist die Abhängigkeit in der POM-Datei setzen, mit' versehen '. aber ich möchte die Abhängigkeit im POM komplett weglassen. – lyomi

+1

Oh, ich habe das nicht bemerkt. Dann können Sie [pomPostProcess] (http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Publishing.html#modifying-the-generated-pom) verwenden, um es "manuell" aus dem zu entfernen POM-Datei. Beispiel hier: https://github.com/scala/pickling/blob/03be7e4e41732f5777e1895682d7c44405430ea7/project/Build.scala#L171-L195 – sjrd

5

Das folgende ist die sbt-Einstellung, die ich mit Hilfe von sjrd geschrieben habe.

import scala.xml.{Node => XmlNode, NodeSeq => XmlNodeSeq, _} 
import scala.xml.transform.{RewriteRule, RuleTransformer} 

pomPostProcess := { (node: XmlNode) => 
    new RuleTransformer(new RewriteRule { 
    override def transform(node: XmlNode): XmlNodeSeq = node match { 
     case e: Elem if e.label == "dependency" && e.child.exists(child => child.label == "scope" && child.text == "provided") => 
     val organization = e.child.filter(_.label == "groupId").flatMap(_.text).mkString 
     val artifact = e.child.filter(_.label == "artifactId").flatMap(_.text).mkString 
     val version = e.child.filter(_.label == "version").flatMap(_.text).mkString 
     Comment(s"provided dependency $organization#$artifact;$version has been omitted") 
     case _ => node 
    } 
    }).transform(node).head 
}