Sbt 将设置放在文件中或放在多项目中的 commonSettings 中有何区别

标签 sbt sbt-assembly sbt-plugin

初学者问题,我有一个多项目 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)

有什么区别?

最佳答案

任何未附加到特定项目设置(即 .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

当根项目也定义了自己的组织时,这将在示例中成立。

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

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

使用命令 sbt“showorganization”sbt“show common/organization” 可以轻松测试这一点。它将分别打印 foobar

最后,如果您希望为所有子项目定义相同的值,请在根项目中为 ThisBuild 范围添加设置,如下例所示:

organization in ThisBuild := "foo"

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

或者将设置存储在Seq中并将其应用到所有子项目和根目录。这将具有与 ThisBuild 范围类似的效果,但更明确一点:

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

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

关于Sbt 将设置放在文件中或放在多项目中的 commonSettings 中有何区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54417189/

相关文章:

scala - 使用 .ivy2 缓存的副本作为 SBT 解析器源

intellij-idea - 如何从 IntelliJ IDEA 中运行 sbt-assembly 任务?

scala - 两个库引入了相同依赖项的不同版本。如何导入它们?

scala - sbt-assembly 排除 dependsOn 依赖

scala - 为 Scala 2.12(Play Framework)添加 Flyway-sbt 插件时出错

scala - 发布由 sbt-native-packager 创建的 zip

scala - 找不到模块 : com. typesafe.activator#activator-ui;(未知)

linux - sbt 下载启动器失败

scala - 内部库新版本时是否有可能收到警告?

elasticsearch - sbt无法在项目中导入两个不同版本的elasticsearch库