Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重头戏2.0/SBT:从Build.scala中的某些/所有模块中排除某些可传递依赖项_Scala_Playframework 2.0_Sbt - Fatal编程技术网

重头戏2.0/SBT:从Build.scala中的某些/所有模块中排除某些可传递依赖项

重头戏2.0/SBT:从Build.scala中的某些/所有模块中排除某些可传递依赖项,scala,playframework-2.0,sbt,Scala,Playframework 2.0,Sbt,我有一个带有Grails前端的大型遗留Java应用程序,我正在努力用一个在游戏中编写的新前端替换Grails前端。遗留Java中的一些(Maven)模块依赖项带来了问题/冲突。在这一点上,对所有遗留Java依赖项进行排序并不是一个真正的选项,因此我只想排除我不喜欢的可传递依赖项 在GrailsBuildConfig.groovy中,我可以定义一个排除列表: def some_bad_things = [ [group: 'some-evil-group'], [n

我有一个带有Grails前端的大型遗留Java应用程序,我正在努力用一个在游戏中编写的新前端替换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
    }
}
val deps = Seq(dependencies)
val appDependencies = excludeFromAll(deps, "groupId", "artifactId")
对于做同样的事情,
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,有多少是特定于播放的。所以,欢迎您提出建议?

回答有点晚,但是,您可以编写一个过滤器,将排除应用于列表中的每个依赖项,如下所示:

def excludeFromAll(items: Seq[ModuleID], group: String, artifact: String) = 
  items.map(_.exclude(group, artifact))
然后使用它来筛选依赖项:

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
    }
}
val deps = Seq(dependencies)
val appDependencies = excludeFromAll(deps, "groupId", "artifactId")
或者,如果您希望获得更流畅的语法,更像常规的sbt内容,但使用更高级的Scala代码(编辑:最初使用Scala 2.10隐式类编写):

这反过来会让你像这样声明你的依赖关系

val appDependencies = Seq(...).excluding("groupId", "artifactId")
我给读者留下了一个可传递的DEP列表作为练习,考虑到这些例子,这应该不会太难,
希望这有帮助

我认为这更容易,就像它告诉SBT文档:


此方法的问题在于排除了给定工件的所有依赖项。

刚刚在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 1.*中,它是
排除规则
。下面是@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")
)

在所有子依赖项都是可选的情况下,这是迄今为止最优雅的解决方案。例如,它解决了我在其他方面与类副本斗争的包含问题。这是我需要解决的一个问题,我已经挣扎了几个星期!非常感谢。