Используйте общие настройки в SBT `RootProject`

Ответ на qaru.site/info/558184/... показывает, как переопределить один параметр для подпроекта, определенного с помощью RootProject из основного проекта. Мне было интересно, есть ли хороший способ сделать это для нескольких настроек, а затем, возможно, для нескольких подпроектов, так что вам не нужно перечислять каждую комбинацию отдельно. Это будет предотвращать распространение и уменьшать вероятность забыть о комбинации и случайно иметь несоответствие настроек.

Если не использовать RootProject, SBT docs показывает, как это сделать с общей последовательностью настроек:

lazy val commonSettings = Seq(
  organization := "com.example",
  version := "0.1.0",
  scalaVersion := "2.11.8"
)

lazy val core = (project in file("core")).
  settings(commonSettings: _*).
  settings(
    // other settings
  )

lazy val util = (project in file("util")).
  settings(commonSettings: _*).
  settings(
    // other settings
  )

Но a RootProject не имеет способа установить свои настройки. Я попробовал что-то вроде следующего, в соответствии с ответом, упомянутым выше:

lazy val util = RootProject(file("../util"))
commonSettings.map(_.key).foreach(key => key in util := key.value)

но это не похоже на правильный подход.

Я рассмотрел использование области Global или ThisBuild, но каждый подпроект устанавливает параметры в свой собственный файл build.sbt, который имеет приоритет над этими более широкими областями, если я правильно понимаю.

Есть ли хороший способ сделать это, или я должен просто задать каждую настройку для каждого подпроекта вручную? Должен ли я использовать разные области применения, например. подпроекты определяют свои настройки в Global и основной проект в ThisBuild?

Ответ 1

Хорошо, вы могли бы сделать это:

commonSettings.map { s => s.mapKey(Def.mapScope(_.in(util))) }

Это создает новый Seq[Setting[_]], где каждая из областей настройки изменяется в проекте util. Это допустимая запись в файле sbt.

Другим вариантом является определение плагина sbt, добавляемого к вашим основным проектам, и в RootProject own build.sbt

Но вы можете захотеть, если вам действительно нужно импортировать проект util как RootProject вместо обычного подпроекта.