Как изменить настройку внутри команды SBT?
Я хочу иметь команду publish-snapshot
, которая запускает задачу publish
с измененным параметром version
(этот параметр должен быть вычислен во время выполнения команды).
Я понял, как получить текущее значение внутренней команды version
, а 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
}
Ответ 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
}
Ответ 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)
}