如何更改 SBT 命令中的设置?

Posted

技术标签:

【中文标题】如何更改 SBT 命令中的设置?【英文标题】:How to change setting inside SBT command? 【发布时间】:2012-12-25 03:04:38 【问题描述】:

我想要一个命令 publish-snapshot 来运行 publish 任务并修改 version 设置(该设置将在执行命令时计算)。

我想出了如何获取version inside 命令的当前值,Project.runTask("task", "scope", ...) 似乎是调用publish 任务的正确调用。

我唯一感到困惑的是如何使用新版本值修改State 实例。我所有的尝试似乎都对原始版本设置没有任何作用。

我的最后一次尝试:

val printVers = TaskKey[Unit]("printvers")
val printVersTask = TaskKey[Unit]("printvers") <<= version map println

def publishSnapshot = Command.command("publish-snapshot")  state =>
  val newState = SessionSettings.reapply(state.get(sessionSettings).get.appendRaw(version := "???"), state)
  Project.runTask(printVers in Compile, newState, true)

  state


lazy val root = Project("main", file("."),
                        settings =
                          Defaults.defaultSettings ++
                          Seq(printVersTask)).settings(commands += publishSnapshot)

有什么方法可以解决这个问题吗?

【问题讨论】:

【参考方案1】:

sbt 邮件列表的帮助下,我能够创建如下解决方案:

def publishSnapshot = Command.command("publish-snapshot")  state =>
  val extracted = Project extract state
  import extracted._
  val eVersion = getOpt(version).get // getting current version
  runTask(publish in Compile,
    append(Seq(version := "newVersion"), state),
    true
  )
  state

【讨论】:

不需要使用runTask()append() 就够了。【参考方案2】:

这实际上对我不起作用。我正在使用 SBT 0.13.7

根据上面的示例调整我必须做的事情,我必须做类似的事情:

def publishSnapshot = Command.command("publish-snapshot")  state =>
  val extracted = Project extract state
  val newState = extracted.append(Seq(version := "newVersion"), state)
  val (s, _) = Project.extract(newState).runTask(publish in Compile, newState)
  s

或者做:

def publishSnapshot = Command.command("publish-snapshot")  state =>
  val newState =
    Command.process("""set version := "newVersion" """, state)
  val (s, _) = Project.extract(newState).runTask(publish in Compile, newState)
  s

【讨论】:

我在0.13.8 上运行,这对我有帮助。尽管将newState 两次作为runTask 的输入看起来非常奇怪。我想知道这是否是故意行为。感谢分享!【参考方案3】:

要通过命令更新任意设置,请执行以下操作:

def updateFoo = Command.command("updateFoo")  state =>
 val extracted = Project extract state
 import extracted._
 println("'foo' set to true")
 //append returns state with updated Foo
 append(Seq(foo := true), state)

【讨论】:

以上是关于如何更改 SBT 命令中的设置?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据不同的 sbt 命令设置 SettingKey 的值?

如何在具有多个子项目的 SBT 项目中覆盖子项目中的设置

SBT:多构建依赖/聚合项目中的覆盖设置

Sbt autoplugin 覆盖项目设置

如何为 sbt 设置堆大小?

如何使用 sbt-native-packager 设置 docker 镜像名称