2013-11-21 9 views
13

sto cercando di chiamare il runTask all'interno del mio compito e considerato questo dovrebbe funzionare:Come posso chiamare un'altra attività dal mio task SBT?

name := "hello" 

version := "1.0" 

scalaVersion := "2.10.2" 

lazy val hello = taskKey[Unit]("executes hey") 

lazy val helloTask = hello <<= runTask(fullClasspath, "sample.Hey" in run, runner in run) 

Ma, beh, non è così. Qualche idea su come potrei fare questo?

risposta

21

risposta generale:

Per rispondere alla tua domanda di carattere generale, la soluzione è quella di rendere il vostro compito dipende dalla altro compito. Invocare il compito direttamente farebbe una fine correre intorno al sistema di dipendenze, il sistema di esecuzione parallela, ecc Si dipendono, e invocare il compito come questo (nella sintassi 0,13-style):

myTask := { 
    ... 
    val result = otherTask.value 
    ... 
} 

noti che otherTask sarà invocato prima dell'inizio di anziché nel punto nel corpo di dove viene visualizzata la dipendenza; perché è così che funzionano le dipendenze.

Se per qualche ragione si trova nel modo "normale" inappropriato o inaccettabile, si consideri che uno stile valido in SBT è quello di separare la dichiarazione di un'attività dalla sua implementazione. Un'implementazione tipica delle attività esegue semplicemente il marshalling degli argomenti e quindi chiama un metodo che esegue effettivamente il lavoro. Se l'attività che si desidera chiamare è implementata in questo modo, quindi una risposta a "Come si chiama l'attività T?" è "No, chiama lo stesso codice T chiama".

risposta specifica:

Ma dal vostro esempio, sembra a me come il problema si sta effettivamente cercando di risolvere è: "Come posso creare un'attività corsa personalizzato, oltre a correre?" Questa domanda ha una risposta nelle FAQ di sbt; vedi http://www.scala-sbt.org/0.13.0/docs/faq.html. La risposta è usare i metodi di convenienza fullRunTask e fullRunInputTask.

Per inciso, se si guarda il codice sorgente per questi metodi, si noterà che non eseguono un'attività che richiama un'altra attività; piuttosto, adottano l'approccio "chiama lo stesso codice".

+0

È ancora applicabile a 0.13.9? perché non includere '(esegui in Compile) .value' all'interno di un'attività personalizzata, fai andare avanti? Nel mio caso voglio solo un'attività personalizzata per eseguire l'attività 'run' di un progetto di dipendenza, senza sovrascrivere' run' in alcun modo. – matanster

+0

Se non hai bisogno di cambiare nulla riguardo al modo in cui 'run' si comporta, allora suona bene. (Penso di averlo detto nella prima parte della mia risposta.) –

+0

Mmmm, non succede nulla nel mio caso. Sembra che '(compile in Compile in SubProject) .value' funzioni ma non' (esegui in Compile in SubProject) .value'. Forse qualcosa di speciale su 'correre' lì. Forse dovrei aprire una nuova domanda per questo. – matanster

Problemi correlati