2013-03-22 24 views
11

Tôi có một ứng dụng Java kế thừa lớn với đầu cuối Grails và tôi đang làm việc thay thế kết thúc trước Grails bằng trong Play. Một số phụ thuộc của mô-đun (Maven) trong Java kế thừa mang lại những thứ có vấn đề/xung đột. Việc phân loại tất cả các phụ thuộc Java cũ không thực sự là một lựa chọn tại thời điểm này, vì vậy tôi muốn loại bỏ các phụ thuộc transitive mà tôi không thích.Chơi 2.0/SBT: Loại trừ một số phụ thuộc transitive nhất định từ một số/tất cả các mô-đun trong Build.scala

Trong Grails BuildConfig.groovy, tôi có thể xác định một danh sách loại trừ:

def some_bad_things = [ 
     [group: 'some-evil-group'], 
     [name: 'some-evil-module-from-another-group'], 
     [name: 'some-other-evil-module'] 
] 

và sau đó sử dụng nó cho một khối toàn phụ thuộc trực tiếp:

dependencies { 
    compile (
     [group: 'com.foo', name: 'foo-module1', version: '1.0'], 
     // ... 20 or 30 modules ... 
     [group: 'com.quux', name: 'quux-module42', version: '7.2'], 
    ) { 
     excludes some_bad_things 
    } 
} 

Nó không rõ ràng những gì cú pháp Build.scala là để làm điều tương tự. Dịch các phụ thuộc thực tế khá đơn giản ...

val appDependencies = Seq(
    "com.foo" % "foo-module1" % "1.0" % "compile", 
    // ... 20 or 30 modules ... 
    "com.quux" % "quux-module42" % "7.2" % "compile" 
) 

... nhưng loại trừ thì không; có vẻ như tôi phải loại trừ mọi thứ riêng lẻ:

val appDependencies = Seq(
    ("com.foo" % "foo-module1" % "1.0" % "compile"), 
     .exclude("some-evil-group", "evil-module-1") 
     .exclude("some-evil-group", "evil-module-2") 
     .exclude("mostly-ok-group-1", "some-evil-module-from-another-group") 
     .exclude("mostly-ok-group-2", "some-other-evil-module"), 

    // ... 20 or 30 modules, each with four excludes ... 

    ("com.quux" % "quux-module42" % "7.2" % "compile") 
     .exclude("some-evil-group", "evil-module-1") 
     .exclude("some-evil-group", "evil-module-2") 
     .exclude("mostly-ok-group-1", "some-evil-module-from-another-group") 
     .exclude("mostly-ok-group-2", "some-other-evil-module") 

) 

Tôi cho rằng không có nhiều khoa học tên lửa đang diễn ra ở đây và thậm chí nếu không có cách nào để loại trừ toàn cầu, nó không nên rất khó để viết một số chức năng trợ giúp, hoặc một cái gì đó, mà sẽ làm điều đó cho tôi. Nhưng tôi là một người mới chơi Scala và thậm chí không rõ ràng với tôi về những gì tôi đang xem hoặc tất cả những gì người điều hành làm, hoặc số tiền mà tôi thấy là Scala/SBT đơn giản và mức độ cụ thể của Play. Vì vậy, đề nghị chào đón?

Trả lời

15

Một cắn câu trả lời cuối nhưng, bạn có thể viết một bộ lọc áp dụng các loại trừ cho mỗi phụ thuộc trong một danh sách như thế này:

def excludeFromAll(items: Seq[ModuleID], group: String, artifact: String) = 
    items.map(_.exclude(group, artifact)) 

và sau đó sử dụng để lọc phụ thuộc của bạn:

val deps = Seq(dependencies) 
val appDependencies = excludeFromAll(deps, "groupId", "artifactId") 

Hoặc nếu bạn muốn nhận được một cú pháp thông thạo hơn, giống như các công cụ sbt thông thường hơn, nhưng với mã Scala cao cấp hơn một chút (sửa: ban đầu đã viết nó với Scala 2.10 lớp ngầm):

implicit def dependencyFilterer(deps: Seq[ModuleID]) = new Object { 
    def excluding(group: String, artifactId: String) = 
    deps.map(_.exclude(group, artifactId)) 
} 

do đó sẽ cho phép bạn khai báo phụ thuộc của bạn như thế này

val appDependencies = Seq(...).excluding("groupId", "artifactId") 

Tôi rời khỏi loại trừ một danh sách các DEPS bắc cầu mà bạn cần như một bài tập cho người đọc, không nên quá cứng đưa ra các ví dụ này, hy vọng điều này sẽ hữu ích!

1

Tôi nghĩ rằng nó dễ dàng hơn như nó kể doc SBT: http://www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Library-Management.html

libDependencies += "com.quux" % "quux-module42" % "7.2" % "compile" intransitive() 

Vấn đề của phương pháp này là bạn loại trừ tất cả các phụ thuộc của một vật nhất định.

+0

đó là bởi đến nay các giải pháp thanh lịch nhất trong trường hợp tất cả các tiểu phụ thuộc là không bắt buộc. Ví dụ. nó đã giải quyết http: //x-stream.github.io/bao gồm cho tôi mà đấu tranh với lớp trùng lặp khác. –

12

Chỉ cần tìm thấy trong SBT 0.13, chúng tôi chỉ đơn giản là có thể làm điều đó thông qua các mã bên dưới:

excludeDependencies ++= Seq(
    SbtExclusionRule("com.google.gwt", "gwt-user"), 
    SbtExclusionRule("com.google.gwt", "gwt-dev"), 
    SbtExclusionRule("com.google.gwt", "gwt-servlet"), 
    SbtExclusionRule("com.google.guava", "guava-gwt") 
) 
+0

Đây là bản sửa lỗi tôi cần cho một vấn đề mà tôi đã phải vật lộn trong nhiều tuần! cảm ơn bạn! – Hrishi

Các vấn đề liên quan