gpt4 book ai didi

scala - SBT 0.13 taskKey 宏不适用于 [Unit]?

转载 作者:行者123 更新时间:2023-12-04 07:54:03 29 4
gpt4 key购买 nike

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!"字符串一切似乎都有效。是我的错,还是宏有问题?

最佳答案

我也遇到了同样的情况。我能够解决这个问题,例如通过添加 : 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
}

以下定义(与上面相同,但没有第一个 println)产生相同的错误“found: Unit, required: 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] 特有的。单元任务不是一个好主意 - 在您的示例中,您至少可以返回 Boolean (成功为真/失败为假)。

关于scala - SBT 0.13 taskKey 宏不适用于 [Unit]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22175959/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com