2015-01-08 22 views
9

Apache Spark'in 1.0, 1.1, 1.2 sürümlerinden biriyle birlikte kullanılabilecek bir yardımcı program kütüphanesi yapıyorum.sbt - yalnızca yayın sırasında belirli bir bağımlılığı hariç tut

Tümüyle geriye dönük olarak uyumlu oldukları için, kullanıcının hangi kıvılcım sürümünü kullanacağına karar vermesini isterim (kitaplığımla birlikte bağımlılık olarak tercih edilen sürümle spark-core ekleyerek) ve herhangi bir sürüm yüklemez kütüphanenin POM'unda kısıtlama. Aksi takdirde bağımlılık tahliye uyarıları ile kullanıcıları rahatsız edecektir.

Herhangi bir derleme davranışı değiştirilmese de yayınlanmış POM'de kütüphane bağımlılığı ihmal edilmek mümkün mü?

cevap

5

Evet, provided yapılandırma özellikle bunun için tasarlanmıştır:

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

derleme sırasında üzerinde sınıf kütüphanesi söyledi koyacağız ama POM dosyasında.

+1

'provided'' ' sağlanan ile, POM dosyasında bağımlılığı koymak yok. ancak POM'deki bağımlılığı tamamen atlatmak istiyorum. – lyomi

+1

Oh Bunun farkında değildim. Daha sonra [pomPostProcess] 'i (http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Publishing.html#modifying-the-generated-pom) kullanarak "el ile" POM dosyası. Örnek burada: https://github.com/scala/pickling/blob/03be7e4e41732f5777e1895682d7c44405430ea7/project/Build.scala#L171-L195 – sjrd

5

Aşağıda, sjrd'nin yardımıyla yazdığım sbt ayarı yer almaktadır.

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 
}