加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:54:06 所属栏目:安全 来源:网络整理
导读: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
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:workserverbuild.sbt:98: error: type mismatch;
 found   : Unit
 required: T
  s.log.info("Finished building database")
            ^
[error] Type error in expression

但是如果我像这样懒惰的val buildDb = taskKey [String](“初始化数据库”)定义它,然后添加到任务“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].单元任务不是一个好主意 – 在您的示例中,您至少可以返回布尔值(对于成功/ false表示失败).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读