【问题标题】:How to modify a setting in a command and retain other session changes?如何修改命令中的设置并保留其他会话更改?
【发布时间】:2016-03-24 05:01:55
【问题描述】:

我有一个简单的命令可以改变myBoolSetting 的值:

commands += Command("mycommand") {
    state ⇒ (Space ~> Bool).?
} { (state, arg) ⇒
    val b = arg.getOrElse(true)
    Project.extract(state).append(Seq(myBoolSetting in Global := b), state)
}

当我更改调用时,它确实会更改 myBoolSetting,但我会丢失任何已通过 set command 更改值的设置。

> set myStringSetting := "new value"
> myCommand false

在本例中,myStringSetting 的值已丢失并具有其默认值。

如何更改设置并保留手动更改的设置?

更新

找到相关问题:Why sbt.Extracted remove the previously defined TaskKey while append method?,但似乎不适用于我的情况。

修改代码:

commands += Command("mycommand") {
    state ⇒ (Space ~> Bool).?
} { (state, arg) ⇒
    val b = arg.getOrElse(true)
    val session = Project.session(state)
    val state2 = Project.extract(state).append(Seq(myBoolSetting in Global := b), state)
    SessionSettings.reapply(session, state2)
}

【问题讨论】:

    标签: sbt


    【解决方案1】:

    我可能只回答你的部分问题。

    丢失myStringSetting 新值的原因是myCommand 重新加载会话有效地为您留下了您在类似build.sbt 的文件中已有的内容以及命令本身设置的内容。您只需在重新加载会话时删除该值。

    这类似于之后执行set scalaVersion := "2.11.7"reloadscalaVersion 成为你在 sbt 配置中的默认 Scala 版本。

    您现在知道为什么会失去价值。如果您想保留该值,您必须保存当前会话 session save 并执行您的命令。您需要将session save 添加到您的命令中。

    【讨论】:

    • 这个答案是部分的,但提供了一个线索。谢谢。
    • 很高兴它有点帮助。为什么在调用命令之前不简单地session save?按照设计,当会话被删除时,所有临时值也会被删除。
    • 我的目标是逐步更改会话设置。
    • 另外session save确实改变了我的build.sbt,它可能会导致git冲突。
    • 啊,所以您想保留临时会话更改而不保存它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2012-06-26
    • 2018-08-25
    • 2021-07-28
    相关资源
    最近更新 更多