我有一个带有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特定的多少。那么,欢迎提出建议吗?
答案 0 :(得分:15)
有点迟到但你可以编写一个过滤器,将排除应用于列表中的每个依赖项:
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列表作为练习给读者,这些例子不应该太难, 希望这有帮助!
答案 1 :(得分:12)
刚刚在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")
)
答案 2 :(得分:1)
我认为它更容易告诉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()
此方法的问题在于您排除了给定工件的所有依赖项。
答案 3 :(得分:0)
在 sbt 1.* 中是 ExclusionRule
。所以这是@Jake W 调整后的答案:
excludeDependencies ++= Seq(
ExclusionRule("com.google.gwt", "gwt-user"),
ExclusionRule("com.google.gwt", "gwt-dev"),
ExclusionRule("com.google.gwt", "gwt-servlet"),
ExclusionRule("com.google.guava", "guava-gwt")
)