¿Cómo cambiar la configuración dentro del comando SBT?

Quiero tener un comando publish-snapshot que ejecute la tarea de publish con la configuración de la version modificada (esa configuración se debe calcular en el momento de la ejecución del comando).

Descubrí cómo obtener el valor actual de la version dentro del comando, y Project.runTask("task", "scope", ...) parece ser una llamada correcta para invocar la tarea de publish .

Lo único con lo que estoy confundido es cómo modificar la instancia de State con un nuevo valor de versión. Todos mis bashs parecen no hacer nada con la configuración de la versión original.

Mi último bash:

 val printVers = TaskKey[Unit]("printvers") val printVersTask = TaskKey[Unit]("printvers") < 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) 

¿Hay alguna forma de arreglar ese comportamiento?

Con la ayuda de la lista de correo sbt , pude crear una solución de la siguiente manera:

 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 } 

En realidad, esto no funcionó para mí. Estoy usando SBT 0.13.7

Adaptando lo que tenía que hacer al ejemplo anterior, tuve que hacer algo como:

 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 } 

O alternativamente hacer:

 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 } 

Para actualizar una configuración arbitraria desde un comando, haga algo como lo siguiente:

 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) }