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)