如何定义在SBT中处理范围相关信息的TaskKey?

时间:2018-02-17 14:58:35

标签: scala sbt

SBT有一个功率范围概念来处理不同条件下的不同键值。

但是我并没有真正掌握如何获取范围相对键值,例如,有build.sbt我希望在不同的项目范围内打印keyTest的不同值:

name := "sbttest"
version := "0.1"
scalaVersion := "2.12.4"

lazy val keyTest = taskKey[Unit]("keyTest")
lazy val settingTest = settingKey[String]("settingTest")

settingTest := "init setting"
keyTest := {
  val currentProjectName = name.value
  val currentSettingTest = settingTest.value
  println("currentProjectName: " + currentProjectName)
  println("currentSettingTest: " + currentSettingTest)
}

lazy val root = (project in file("."))
  .settings(
    name := "projRoot",
    settingTest := "setting_root"
  )

lazy val projA = (project in file("projA"))
  .settings(
    name := "projA",
    settingTest := "setting_A"
  )

结果是sbt:

> ;project root;keyTest
 currentProjectName: sbttest
 currentSettingTest: init setting

> ;project projA;keyTest
[error] Not a valid command: testKey
[error] Not a valid project ID: testKey
[error] Expected ':'
[error] Not a valid key: testKey (similar: test, testOnly, testFilter)
[error] testKey
[error]        ^

如何打印与rootprojA项目截然不同的结果?

   > ;project root;keyTest
   currentProjectName: projRoot
   currentSettingTest: setting_root

   > ;project projA;keyTest
   currentProjectName: projA
   currentSettingTest: setting_A

1 个答案:

答案 0 :(得分:0)

默认情况下,build.sbt中的顶级表达式在根项目范围内进行评估。在多个项目中使用常用设置的最简单方法是创建一系列这些设置,并使用每个项目上的序列调用.settings方法。例如,您的build.sbt将如下所示:

val keyTest = taskKey[Unit]("keyTest")
val settingTest = settingKey[String]("settingTest")

lazy val commonSettings = Seq(
  version := "0.0.1",
  scalaVersion := "2.12.4",

  keyTest := {
    val currentProjectName = name.value
    val currentSettingTest = settingTest.value
    println("currentProjectName: " + currentProjectName)
    println("currentSettingTest: " + currentSettingTest)
  }
)

lazy val root = (project in file("."))
  .settings(
    commonSettings,
    name := "projRoot",
    settingTest := "setting_root"
  )

lazy val projA = (project in file("projA"))
  .settings(
    commonSettings,
    name := "projA",
    settingTest := "setting_A"
  )
sbt:projRoot> sbtVersion
[info] 1.1.1

sbt:projRoot> root / keyTest
currentProjectName: projRoot
currentSettingTest: setting_root
[success] Total time: 0 s, completed Feb 17, 2018 11:35:27 AM

sbt:projRoot> projA / keyTest
currentProjectName: projA
currentSettingTest: setting_A
[success] Total time: 0 s, completed Feb 17, 2018 11:35:36 AM