Sbt в чем разница размещения настроек в файле или в общих настройках в мультипроекте

Вопрос для начинающих, у меня есть многопроектный файл sbt, есть ли разница, если я поставлю общие настройки в начале файла? например:

organization := "com.example"
  version := "0.0.1-SNAPSHOT"
  scalaVersion := "2.11.12"
resolvers ++= Seq(
    "Apache Development Snapshot Repository" at "https://repository.apache.org/content/repositories/snapshots/",
    "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/",

    Resolver.mavenLocal
  )
assemblyMergeStrategy in assembly := {
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case x => MergeStrategy.first
  }
lazy val commonSettings  = Seq(  libraryDependencies ++= commonDependencies ++ testingDependencies)
lazy val sharedProject = (project in file(...))
.settings(commonSettings: _*)
val projectA = .....dependsOn(sharedPorject)
val projectB = .....dependsOn(sharedPorject)

Или если я поставлю его в общих настройках

lazy val commonSettings  = Seq(  
organization := "com.example",
  version := "0.0.1-SNAPSHOT",
  scalaVersion := "2.11.12",
resolvers ++= Seq(
    "Apache Development Snapshot Repository" at "https://repository.apache.org/content/repositories/snapshots/",
    "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/",
    Resolver.mavenLocal
  ),
assemblyMergeStrategy in assembly := {
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case x => MergeStrategy.first
  },
libraryDependencies ++= commonDependencies ++ testingDependencies)
lazy val sharedProject = (project in file(...))
.settings(commonSettings: _*)
val projectA = .....dependsOn(sharedPorject)
val projectB = .....dependsOn(sharedPorject)

в чем разница?

1 ответ

Решение

Любые настройки, определенные без привязки к настройкам конкретного проекта, т.е. .settings()Прикреплены к корневому проекту.

Код такой

organization := "foo"

такой же как

lazy val root = (project in file(".")).settings(organization := "foo")

Теперь, если вы определили новый подпроект, как common и добавить organization к этому

lazy val common = (project in file("common")).settings(organization := "bar")

Это и только это будет иметь значение organization установлен в bar,

Это будет иметь место в примере, когда корневой проект имеет свой собственный organization определены тоже.

lazy val root = (project in file(".")).settings(organization := "foo")

lazy val common = (project in file("common")).settings(organization := "bar")

Это легко проверить с помощью команд sbt "show organization" а также sbt "show common/organization", Будет печатать foo а также bar соответственно.

Наконец, если вы хотите, чтобы одно и то же значение было определено для всех подпроектов, добавьте настройки в корневой проект для области видимости. ThisBuild как в этом примере:

organization in ThisBuild := "foo"

lazy val common = (project in file("common")).settings(???)

Или сохранить настройки в Seq и применить его ко всем подпроектам и root. Это будет иметь тот же эффект, что и в области ThisBuild но это немного более явно:

val commonSettings = Seq(organization := "foo")

lazy val root = (project in file(".")).settings(commonSettings)
lazy val common = (project in file("common")).settings(commonSettings)
Другие вопросы по тегам