【问题标题】:Why my usage of `ThisBuild` is not working?为什么我对“ThisBuild”的使用不起作用?
【发布时间】:2015-08-01 03:51:00
【问题描述】:

我写了一个简单的SBT插件,里面定义了一个helloMessage,默认值为None

lazy val helloMessage = settingKey[Option[String]]("the message for hello")

override def projectSettings = Seq(
  helloMessage in ThisBuild := None,
  hello := println("Hello from my plugin: " + helloMessage.value)
)

然后在一个测试项目中,我添加了这个插件,并在build.sbt中定义:

helloMessage in ThisBuild := Some("hello from this build")

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

lazy val core = project in file("core")

你可能注意到我用ThisBuild 代替helloMessage

但问题是,当我在测试项目中运行./sbt helloMessage 时,它只会输出None!不是我定义的消息Some("hello from this build")

但如果我删除这两行:

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

lazy val core = project in file("core")

或只是core 行,它将输出预期的消息Some("hello from this build")

哪里错了?如果我必须保留多个项目,如何解决?

【问题讨论】:

    标签: plugins sbt settings


    【解决方案1】:

    按照in the docs 的建议,首先使用buildSettings 进行in ThisBuild 设置。

    【讨论】:

    • 谢谢,我只是在buildSettings中定义了helloMessage := None,现在可以了。但很快我发现它可以使用name.valuetarget.value等设置
    【解决方案2】:

    一个可能的解决方案,改变:

    helloMessage in ThisBuild := None
    

    helloMessage in Global := None
    

    【讨论】:

      【解决方案3】:

      我认为问题在于初始化顺序。在您的 build.sbt 文件中,helloMessage in ThisBuild := Some("hello from this build") 行将首先执行。这将在全局(构建)范围内设置 helloMessage 设置。

      现在,当您的任何项目被初始化时,它将运行新设置helloMessage in ThisBuild := None。这会将全局范围内的 helloMessage 设置覆盖为 None

      解决此问题的一种方法是从项目设置中删除ThisBuild。也就是说,您将 ThisBuild 范围保留在您的主 bu​​ild.sbt 文件中,但将本地范围 (helloMessage := None) 保留在插件定义的项目设置中。

      【讨论】:

        猜你喜欢
        • 2010-10-08
        • 2016-02-27
        • 2019-01-13
        • 2015-09-07
        • 1970-01-01
        • 2023-04-03
        • 2011-04-30
        • 2011-09-04
        • 2011-10-15
        相关资源
        最近更新 更多