2013-01-10 21 views
29

Voglio avere un comando publish-snapshot che eseguirà l'attività publish con l'impostazione version modificata (tale impostazione deve essere calcolata al momento dell'esecuzione del comando).Come modificare le impostazioni nel comando SBT?

Ho scoperto come ottenere il valore corrente del comando interno version e Project.runTask("task", "scope", ...) sembra essere una chiamata giusta per richiamare l'attività publish.

L'unica cosa di cui sono confuso è come modificare l'istanza State con un nuovo valore di versione. Tutti i miei tentativi sembrano non fare nulla per l'impostazione della versione originale.

Il mio ultimo tentativo:

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) 

c'è qualche modo per risolvere questo comportamento?

risposta

20

Con l'aiuto di sbt mailing list, sono stato in grado di creare una soluzione come segue:

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

Questo in realtà non ha funzionato per me. Sto usando SBT 0.13.7

Adattamento quello che ho dovuto fare per l'esempio di cui sopra, ho dovuto fare qualcosa di simile:

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 
} 

Oppure, in alternativa fare:

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

Sono in esecuzione su '0.13.8' e questo mi ha aiutato. Anche se sembra super strano avere il 'newState' due volte come input per' runTask'. Mi chiedo se questo è un comportamento intenzionale. Grazie per la condivisione! – mavilein

3

Per aggiornare un'impostazione arbitraria da un comando, fare qualcosa di simile al seguente:

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