SBT 0.13 taskKey宏不能与[Unit]一起使用?

时间:2014-03-04 15:22:10

标签: 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.error("Failed to initialize the database: " + e.getMessage)
  }
  s.log.info("Finished building database")
}

这会产生以下错误

C:\work\server\build.sbt:98: error: type mismatch;
 found   : Unit
 required: T
  s.log.info("Finished building database")
            ^
[error] Type error in expression

但是,如果我将其定义为lazy val buildDb = taskKey[String]("Initializes the database"),然后添加到任务"Happy end!"字符串的最后一行,那么一切似乎都有效。我应该责怪,还是宏观问题?

1 个答案:

答案 0 :(得分:7)

同样的事发生在我身上。我能够解决这个问题,例如通过向taskKey定义添加: TaskKey[Unit]。以下是我对sbt 0.13.5的调查结果:

以下定义是可以的(似乎运气真的很好):

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

collectJars := {
  println("these are my JARs:")
  (externalDependencyClasspath in Runtime).value foreach println
}

以下定义(与上面没有第一个println相同)产生相同的错误"发现:单位,必需:T":

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

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

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

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

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

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

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