【问题标题】:How to change setting inside SBT command?如何更改 SBT 命令中的设置?
【发布时间】: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)

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

【问题讨论】:

    标签: scala sbt


    【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多