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],所以这里有些东西看起来很不对劲。它对我使用SBT0.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
}