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

scala – 根据设置重新定义sbt任务

发布时间:2020-12-16 10:06:07 所属栏目:安全 来源:网络整理
导读:我想根据设置的值重新定义一个sbt任务.在默认情况下,它应该执行原始任务,在另一种情况下,我想运行自定义任务. 给定任务和设置: val someSetting = Def.settingKey[Boolean]("some setting")val fooTask = Def.taskKey[String]("foo task")someSetting := tr
我想根据设置的值重新定义一个sbt任务.在默认情况下,它应该执行原始任务,在另一种情况下,我想运行自定义任务.

给定任务和设置:

val someSetting = Def.settingKey[Boolean]("some setting")
val fooTask = Def.taskKey[String]("foo task")

someSetting := true

fooTask := {
  println("** foo effect **")
  "foo value"
}

试图重新定义fooTask:

fooTask := {
  if( someSetting.value ) fooTask
  else Def.task("whatever")
}.value

给出编译错误:

build.sbt:39: error: Illegal dynamic dependency
  if( someSetting.value ) fooTask
      ^

使用Def.task任务编译……

fooTask := Def.task {
  if( someSetting.value ) fooTask.value
  else Def.task("whatever").value
}.value

…但即使someSetting为false也会被执行!

> set someSetting := false
[info] Defining *:someSetting
[info] The new value will be used by *:fooTask
[info] Reapplying settings...
> fooTask
** foo effect **
[success] Total time: 1 s,completed Mar 20,2017 11:40:13 PM

试着改用Def.taskDyn ……

fooTask := Def.taskDyn {
  if( someSetting.value ) fooTask
  else Def.task("whatever")
}.value

…导致“在运行时引用未定义的设置”:

> set someSetting := true
[info] Defining *:someSetting
[info] The new value will be used by *:fooTask
[info] Reapplying settings...
[info] Set current project to sbt-task-games (in build file:/Users/jast/playspace/untitled8/)
> fooTask
[trace] Stack trace suppressed: run last *:fooTask for the full output.
[error] (*:fooTask) sbt.Init$RuntimeUndefined: References to undefined settings at runtime.
[error] setting(ScopedKey(Scope(Select(ProjectRef(file:/Users/jast/playspace/untitled8/,untitled8)),Global,Global),fooTask)) at RangePosition(/Users/jast/playspace/untitled8/build.sbt,LineRange(43,47)) referenced from ScopedKey(Scope(Select(ProjectRef(file:/Users/jast/playspace/untitled8/,fooTask)
[error] Total time: 0 s,2017 11:49:59 PM

解决方法

在返回执行任务的任务之前,您需要“保存”对实际任务的引用.这就是taskValue的用途:

fooTask := Def.taskDyn {
  val default = fooTask.taskValue
  if (someSetting.value) Def.task(default.value)
  else Def.task("whatever")
}.value

(编辑:李大同)

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

    推荐文章
      热点阅读