簡體   English   中英

Play 2.0 / SBT:從Build.scala中的某些/所有模塊中排除某些傳遞依賴項

[英]Play 2.0 / SBT: Exclude certain transitive dependencies from some/all modules in Build.scala

我有一個帶有Grails前端的大型遺留Java應用程序,我正在用一個用Play編寫的新程序替換Grails前端。 遺留Java中的一些(Maven)模塊依賴項會帶來有問題/沖突的問題。 在這一點上排除所有遺留Java依賴項並不是一個真正的選項,所以我想排除我不喜歡的傳遞依賴項。

在Grails BuildConfig.groovy ,我可以定義一個排除列表:

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

然后將它用於整個直接依賴項塊:

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
    }
}

Build.scala語法對於做同樣的事情並不明顯。 翻譯實際的依賴關系非常簡單......

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

......但排除不是; 看起來我必須單獨排除所有內容:

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")

)

我假設這里沒有太多的火箭科學,即使沒有開箱即用的全局排除方式,也不應該寫一些輔助功能,或其他東西,這樣做對我來說。 但我是Scala的新手,對我來說,我正在看的是什么類型或者所有運營商做了什么,或者我看到的有多少是普通的Scala / SBT以及Play特定的多少。 那么,建議歡迎嗎?

回答有點遲,但是,您可以編寫一個過濾器,將排除應用於列表中的每個依賴項,如下所示:

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

然后使用它來過濾您的依賴項:

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

或者如果你想得到一個更流暢的語法,更像是常規的sbt東西,但有一些更高級的Scala代碼(編輯:最初使用Scala 2.10隱式類編寫):

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

這反過來會讓你像這樣聲明你的依賴

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

我將排除一個傳遞性的deps列表作為讀者的練習,不應該太難給出這些例子,希望這有幫助!

剛剛在SBT 0.13中找到,我們可以通過以下代碼完成:

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")
)

我認為它更容易告訴SBT doc: http//www.scala-sbt.org/0.12.2/docs/Detailed-Topics/Library-Management.html

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

此方法的問題是您排除給定工件的所有依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM