以设置为条件重新定义 sbt 任务 [英] Redefine an sbt task conditional on a setting

查看:45
本文介绍了以设置为条件重新定义 sbt 任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想重新定义一个以设置值为条件的 sbt 任务.在默认情况下,它应该执行原始任务,在其他情况下,我想运行一个自定义任务.

I would like to redefine an sbt task conditional on the value of a setting. In the default case, it should execute the original task, in the other case, I want to run a custom task.

给定任务和设置:

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

someSetting := true

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

尝试重新定义 fooTask:

Trying to redefine fooTask:

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

给出编译错误:

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

使用 Def.task 任务编译...

Using Def.task the task compiles ...

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

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

... but gets executed even if someSetting is 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 代替...

Trying to use Def.taskDyn instead ...

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

... 导致在运行时引用未定义的设置":

... results in "References to undefined settings at runtime":

> 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,Global),fooTask)) at RangePosition(/Users/jast/playspace/untitled8/build.sbt,LineRange(43,47)) referenced from ScopedKey(Scope(Select(ProjectRef(file:/Users/jast/playspace/untitled8/,untitled8)),Global,Global,Global),fooTask)
[error] Total time: 0 s, completed Mar 20, 2017 11:49:59 PM

推荐答案

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

You need to "save" a reference to the actual task before returning a task that executes it. This is what taskValue is for:

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

这篇关于以设置为条件重新定义 sbt 任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆