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