【问题标题】:Why can't I override settings in SBT subproject if it defines a Project value?如果 SBT 子项目定义了项目值,为什么我不能覆盖它的设置?
【发布时间】:2017-08-17 06:30:23
【问题描述】:

我有一个像这样定义root 的子项目:

lazy val root = (project in file(".")).enablePlugins(PlayScala)

并且没有定义任何其他设置。

在我的主要项目中,我这样引用它:

lazy val mylib = (project in file("mylib"))
lazy val myapp = (project in file("myapp")).dependsOn(mylib)

问题在于以这种方式引用,mylib 是使用 Scala 2.10 构建的,因为它没有指定 scalaVersion 而 2.10 是 SBT 的默认值。

如果我尝试覆盖这样的任何设置:

lazy val mylib = (project in file("mylib")).settings(Seq(scalaVersion := "2.11.8"))

他们被忽略了。

但是,如果我从子项目的 build.sbt 中删除 lazy val root = ...,则从主构建文件传递的设置将按预期工作。然而,这会破坏子项目的独立构建,因为必须在主文件中启用 PlayScala 插件。

那么我怎样才能引用这样的项目并覆盖一些设置呢?

我可以通过全局更改设置(即scalaVersion in ThisBuild)来解决此问题,但我希望能够覆盖其他内容,例如在这种情况下固定为root 的项目ID。

【问题讨论】:

    标签: scala build sbt


    【解决方案1】:

    我通常会覆盖这样的设置,而且效果很好。

    lazy val mylib = (project in file("mylib")).settings(
      scalaVersion := "2.11.8"
      //any other settings, I want to override, separated by comma
      propertyA := "A",
      propertyB := "C"
    )
    

    不同的是,我的 Play 应用程序中通常有依赖项,但所有内容都列在一个 build.sbt 下

    【讨论】:

    • 是的,这就是我正在做的事情,但是我想要包含的项目之一是从 github repo 克隆的子模块(我希望与上游保持兼容),它包括惰性val root = ... 启用 Play 插件的行。如果它没有定义一个项目,它会工作得很好,但它确实,我不能覆盖它的设置>。
    • 能否分享一下你正在使用的sbt文件,这样更容易复制
    猜你喜欢
    • 2018-04-09
    • 2020-06-08
    • 2015-01-27
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多