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!"
字符串的最后一行,那么一切似乎都有效。我应该责怪,还是宏观问题?
答案 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表示失败)。