SBT插件:在运行taskKey之前,使用inputTask覆盖settingKey吗?

沃尼

我有一个tasksettingA和settingB`作为输入来运行的。

我希望有一个inputTask可以覆盖settingAtask使用的新值运行settingA

那怎么办?

谢谢。

更多细节:

任务将类似于:

Def.taskDyn {
   val settingAValue = settingA.value
   val settingBValue = settingB.value

   Def.task {
      settingAValue + settingBValue
   }
}

人们会在他们的build.sbt

settingA := 3
settingB := 1

然后sbt task会屈服4

我想要一个inputTask

Def.inputTaskDyn {
  val newValue = customParser.parsed

  Def.taskDyn {
     val settingCValue = settingC.value

     Def.task {
        // call task with settingA = newValue ? 
     }
  }
}

编辑:

如果这样可以简化操作,settingA可以使用Task而不是Setting

弗拉基米尔·马特维耶夫(Vladimir Matveev)

您可以这样做:

lazy val setting1 = settingKey[String]("")
lazy val setting2 = settingKey[String]("")

lazy val task1 = taskKey[Unit]("")
lazy val inputTask1 = inputKey[Unit]("")

setting1 := "a"
setting2 := "b"

task1 := {
  println(setting1.value + setting2.value)
}

inputTask1 := {
  val newValue = Parsers.spaceDelimited("arg").parsed.head
  val curState = state.value
  val updState = Project.extract(curState).appendWithoutSession(
    Vector(setting1 := newValue),
    curState
  )
  Project.extract(updState).runTask(task1, updState)
}

基本上,您可以依靠SBT构建状态是完全自省的事实,并且可以修改它并以新状态运行任务。

但是,文档建议不要在任务中使用此功能。通常,SBT模型是所有设置实际上都是不可变的-您不能也不应该在任务执行期间修改它们。相反,建议为此使用命令

commands += command1

lazy val command1 = Command.args("command1", "") { (state, args) =>
  val updState = Project.extract(state).appendWithoutSession(
    Vector(setting1 := args.head),
    state
  )
  val (finalState, _) = Project.extract(updState).runTask(task1, updState)
  finalState
}

请注意,该命令setting1在执行后保留设置为提供的值。如果您不想这样做,则应返回原始状态值,或者更好的是,将的原始值保存setting1到本地变量,然后在任务运行后将其恢复原状:

lazy val command1 = Command.args("command1", "") { (state, args) =>
  val newValue = args.head
  val originalValue = Project.extract(state).get(setting1)

  val updState = Project.extract(state).appendWithoutSession(
    Vector(setting1 := newValue),
    state
  )
  val (nextState, _) = Project.extract(updState).runTask(task1, updState)

  Project.extract(nextState).appendWithoutSession(
    Vector(setting1 := originalValue),
    nextState
  )
}

不幸的是,API不是很直观(例如,您必须调用Project.extract很多),但这是执行所需操作的正确方法。请注意,可以通过多种方式构造命令,包括拥有自己的情况ParserCommand.args为了简单起见,我已经在上面使用过。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

需要从我在 sbt 插件中使用的插件中提供 SettingKey

SBT-运行任务以设置SettingKey

使用SBT InputTask获取设置和参数

我可以使用类路径覆盖正在运行的jar中的文件吗?

使用ddrescue恢复损坏的驱动器。我可以在运行完成之前检查进度吗?

您可以在命令中访问SBT SettingKey吗?

在运行视图控制器 (Swift) 的“覆盖”功能之前等待异步调用完成

在运行其余食谱之前,使用Chef设置DNS?

如何在SettingKey或TaskKey上调用该.value?

在运行迁移之前,django迁移正在运行django table2模块的筛选器吗?

在运行之前停止xcode?

如何动态调用SBT InputTask?

Sbt 自动插件覆盖项目设置

在运行测试之前如何运行任务

up:在运行清单头之前,可以对照主文件检查$ hostname吗?

有人可以在运行该Windows命令之前对其进行检查吗?

在输入VBA项目密码之前,要禁用“查看宏”屏幕中正在运行的宏吗?

Gradle:我应该在运行之前每次都启动构建吗?

我可以在运行之前验证我的Sequence容器吗?(视觉工作室)

可以在运行时使用Javascript创建函数吗?

我在运行Bash吗?

在运行时覆盖资源

在运行时覆盖 SpringBootJar 类

在运行时覆盖 angularjs 指令

使用sbt构建的应用程序在运行时发生NoClassDefFoundError

在 sbt 中使用 docker 插件

在运行之前检查脚本的输出

在运行测试之前更改cwd

在运行其余方法之前更新UI