2017-03-20 13 views
3

設定値でsbtタスクの条件を再定義したいと思います。デフォルトの場合は元のタスクを実行し、別の場合はカスタムタスクを実行します。 fooTaskを再定義しようとすると設定でsbtタスクの条件を再定義する

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

someSetting := true 

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

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

は、コンパイルエラーを与える:

Def.taskタスクはコンパイル...

を使用して
build.sbt:39: error: Illegal dynamic dependency 
    if(someSetting.value) fooTask 
    ^

タスクと設定を考えると

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

... someSettingが偽であっても...実行されます!

代わり Def.taskDynを使用しようと
> 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 

...

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,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 

答えて

5

あなたが "保存" する必要がありますそれを実行するタスクを返す前に実際のタスクを参照してください。これは、taskValueの対象は、

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

ありがとうございます。私はこれを解決するために数時間苦労してきましたが、これは私の一日を助けました。 ;-) –

関連する問題