我写了一个简单的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")
。
哪里错了?如果我必须保留多个项目,如何修复它?
答案 0 :(得分:0)
首先按照建议in the docs使用buildSettings
进行in ThisBuild
设置。
答案 1 :(得分:0)
可能的解决方案,改变:
helloMessage in ThisBuild := None
到
helloMessage in Global := None
答案 2 :(得分:0)
我认为问题在于初始化顺序。在build.sbt文件中,将首先执行行helloMessage in ThisBuild := Some("hello from this build")
。这将在全局(构建)范围中设置helloMessage
设置。
现在,当您的任何项目初始化时,它将运行新设置helloMessage in ThisBuild := None
。这将覆盖全局范围中的helloMessage设置为None
。
解决此问题的一种方法是从项目设置中删除ThisBuild
。也就是说,您将ThisBuild
范围保留在主build.sbt文件中,但将本地范围(helloMessage := None
)保留在插件定义中的项目设置中。