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")
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误
C:\work\server\build.sbt:98: error: type mismatch;
found : Unit
required: T
s.log.info("Finished building database")
^
[error] Type error in expression
Run Code Online (Sandbox Code Playgroud)
但是,如果我像这样定义它lazy val buildDb = taskKey[String]("Initializes the database")然后添加到任务"Happy end!"字符串的最后一行似乎一切正常.我应该责怪,还是宏观问题?
同样的事发生在我身上.我能够解决这个问题,例如通过: TaskKey[Unit]在taskKey定义中添加一个.以下是我对sbt 0.13.5的调查结果:
以下定义是可以的(似乎这是好运,这是好的):
lazy val collectJars = taskKey[Unit]("collects JARs")
collectJars := {
println("these are my JARs:")
(externalDependencyClasspath in Runtime).value foreach println
}
Run Code Online (Sandbox Code Playgroud)
以下定义(与上面没有第一个println相同)产生相同的错误"found:Unit,required:T":
lazy val collectJars = taskKey[Unit]("collects JARs")
collectJars := {
(externalDependencyClasspath in Runtime).value foreach println
}
Run Code Online (Sandbox Code Playgroud)
我的发现是,这绝对是神奇的东西:例如,如果我将该行缩进lazy val collectJars = ...一个空白,那么它就会编译.我希望(但尚未检查).sbt和.scala构建定义的行为也不同.
但是,如果添加类型签名,它似乎总是编译:
lazy val collectJars: TaskKey[Unit] = taskKey[Unit]("collects JARs")
collectJars := {
(externalDependencyClasspath in Runtime).value foreach println
}
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的:问题似乎特定于TaskKey [Unit].单元任务不是一个好主意 - 在您的示例中,您至少可以返回布尔值(对于成功/ false表示失败).
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |