Как изменить настройку внутри команды 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)

Есть ли способ исправить это поведение?

3 ответа

Решение

С помощью 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
}

Это на самом деле не работает для меня. Я использую 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
}

Чтобы обновить произвольную настройку из команды, сделайте что-то вроде следующего:

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)
}
Другие вопросы по тегам