2

Beginners question, I have a multi project sbt file is there a difference if I put general settings at the beginning of the file? e.g :

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)

Or if I put it in the common settings

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)

what is the difference ?

igx
  • 4,101
  • 11
  • 43
  • 88

1 Answers1

2

Any settings defined without attaching it to a specific project's settings, ie .settings(), are attached to root project.

Thus code like this

organization := "foo"

is same as

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

Now, if you defined a new sub-project like common and add organization to it

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

It and only it will have value organization set to bar.

This will hold in the example when root project has its own organization defined too.

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

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

This is easy to test with commands sbt "show organization" and sbt "show common/organization". It will print foo and bar respectively.

Finally, if you'd like to have same value defined for all sub-projects, add settings in root project for scope ThisBuild like in this example:

organization in ThisBuild := "foo"

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

Or store settings in a Seq and apply it to all sub-projects and root. This will have similar effect as in scope ThisBuild but it's a bit more explicit:

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

lazy val root = (project in file(".")).settings(commonSettings)
lazy val common = (project in file("common")).settings(commonSettings)
Ivan Stanislavciuc
  • 7,140
  • 15
  • 18