2015-01-08 12 views
9

Tôi đang xây dựng một thư viện tiện ích có thể được sử dụng cùng với một trong các phiên bản 1.0, 1.1, 1.2 của Apache Spark.sbt - loại trừ sự phụ thuộc nhất định chỉ trong khi xuất bản

Vì chúng đều tương thích ngược về nhị phân, tôi muốn cho phép người dùng quyết định sử dụng phiên bản tia lửa nào (bằng cách thêm spark-core phiên bản ưa thích làm phụ thuộc cùng với thư viện của tôi) và không áp đặt bất kỳ phiên bản nào hạn chế trong POM của thư viện. Nếu không, nó sẽ làm phiền người dùng với cảnh báo trục xuất phụ thuộc.

Có thể làm cho sbt bỏ qua phụ thuộc thư viện trong POM được xuất bản trong khi không thay đổi bất kỳ hành vi biên dịch nào không?

Trả lời

5

Vâng, cấu hình provided được thiết kế đặc biệt cho rằng:

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

sẽ đưa cho biết thư viện trên classpath quá trình biên dịch, nhưng không phải trong file POM.

+1

'provided' không đưa phụ thuộc trong file POM, với ' cung cấp'. nhưng tôi muốn hoàn toàn bỏ qua sự phụ thuộc trong POM. – lyomi

+1

Ồ, tôi không nhận ra điều đó. Sau đó, bạn có thể sử dụng [pomPostProcess] (http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Publishing.html#modifying-the-generated-pom) để xóa nó "thủ công" khỏi Tệp POM. Ví dụ tại đây: https://github.com/scala/pickling/blob/03be7e4e41732f5777e1895682d7c44405430ea7/project/Build.scala#L171-L195 – sjrd

5

Sau đây là cài đặt sbt tôi đã viết bằng cách sử dụng trợ giúp của sjrd.

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 
} 
Các vấn đề liên quan