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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |