Scala SBT 0.13 taskKey宏不';你不能和[单位]一起工作吗?

Scala SBT 0.13 taskKey宏不';你不能和[单位]一起工作吗?,scala,sbt,Scala,Sbt,这会产生以下错误 lazy val buildDb = taskKey[Unit]("Initializes the database") buildDb := { (compile in Compile).value val s: TaskStreams = streams.value s.log.info("Building database") try { ... } catch { case e: Throwable => sys.

这会产生以下错误

lazy val buildDb = taskKey[Unit]("Initializes the database")

buildDb := {
  (compile in Compile).value
  val s: TaskStreams = streams.value
  s.log.info("Building database")
  try {
    ...
  } catch {
    case e: Throwable =>
      sys.error("Failed to initialize the database: " + e.getMessage)
  }
  s.log.info("Finished building database")
}

但是如果我像这样定义它,
lazy val buildDb=taskKey[String](“初始化数据库”)
,然后在任务的最后一行添加“Happy end!”String,一切似乎都正常。是我的错,还是宏出了问题?

同样的事情也发生在我身上。我可以通过在TaskKey定义中添加一个
:TaskKey[Unit]
来解决此问题。以下是我对sbt 0.13.5的调查结果:

以下定义是可以的(这似乎是纯粹的运气,这是可以的):

以下定义(与上面相同,没有第一个println)产生相同的错误“found:Unit,required:T”:

我的发现是,这绝对是一件神奇的事情:例如,如果我将行
lazy val collectJars=…
缩进一个空格,那么它就会编译。我希望(但没有检查).sbt和.scala构建定义的行为也有所不同

但是,如果添加类型签名,它似乎总是编译:

lazy val collectJars = taskKey[Unit]("collects JARs")

collectJars := {
  (externalDependencyClasspath in Runtime).value foreach println
}

最后但并非最不重要的一点:问题似乎针对TaskKey[Unit]。单元任务不是一个好主意-在您的示例中,您至少可以返回布尔值(成功为true,失败为false)。

如果最后一行是
()
,会发生什么情况。我以前使用过taskKey[Unit],所以这里有些东西看起来很不对劲。它对我使用SBT
0.13.2-M2
效果很好。你能移除
试着捕捉
块并再次尝试吗?你能在这个问题上添加
sbt about
吗?try/catch块也引起了我的注意。我想知道您是否需要将其移动到它自己的方法。我有一个
TaskKey[Seq[File]]
任务,它的行为也很奇怪。起初我认为我的.sbt文件中有一个错误,但后来我意识到在字符串中添加了一个空格,或者额外的换行符也导致它抛出了一个类型不匹配错误。添加类型签名似乎已经修复了它。谢谢事实证明,该类型是不相关的,这只是导致sbt刷新导致问题的前一次运行中的数据。即使有打字签名,我也会再次遇到这种情况。删除所有my/target目录会清除它。
lazy val collectJars = taskKey[Unit]("collects JARs")

collectJars := {
  println("these are my JARs:")
  (externalDependencyClasspath in Runtime).value foreach println
}
lazy val collectJars = taskKey[Unit]("collects JARs")

collectJars := {
  (externalDependencyClasspath in Runtime).value foreach println
}
lazy val collectJars: TaskKey[Unit] = taskKey[Unit]("collects JARs")

collectJars := {
  (externalDependencyClasspath in Runtime).value foreach println
}