Подтвердить что ты не робот

Play 2.0/SBT: исключить некоторые транзитивные зависимости от некоторых/всех модулей в Build.scala

У меня есть большое унаследованное Java-приложение с интерфейсом Grails, и я работаю над заменой переднего конца Grails новым, написанным в Play. Некоторые из зависимостей модуля (Maven) в старой Java приводят к проблемным/противоречивым вещам. Сортировка всех устаревших зависимостей 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 и сколько стоит Плей-специфичны. Итак, предложения приветствуются?

4b9b3361

Ответ 1

Немного поздний ответ, но вы можете написать фильтр, который применяет исключение для каждой зависимости в списке, подобном этому:

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

Я оставляю исключающий список транзитивных отпечатков, которые вам нужны в качестве упражнения для читателя, не должен быть слишком жестким, учитывая эти примеры, надеюсь, это помогло!

Ответ 2

Только что найденный в 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")
)

Ответ 3

Мне кажется, что это проще, так как он сообщает 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()

Проблема этого метода заключается в том, что вы исключаете ВСЕ зависимости от данного артефакта.