2013-06-11 11 views
14

sono in grado di eseguire automaticamente un'attività prima della compilazione con:SBT applicare Task dopo Compile

compile in Compile <<= (compile in Compile).dependsOn(myTask) 

Come faccio a fare lo stesso, ma dopo compilare?

so che posso fare:

compile in Compile <<= (compile in Compile) map{x=> 
    // post-compile work 
    doFoo() 
    x 
} 

per eseguire codice Scala arbitrario, ma ho bisogno di eseguire automaticamente l'operazione di destinazione stesso quando si verifica un evento di compilazione

fare qualcosa di simile:

val foo = TaskKey[Unit]("foo", "...") 
val fooTask = foo <<= scalaInstance map {si => 
... 
} dependsOn(compile in Compile) 

funziona se si digita "foo" dal prompt sbt>; il task viene eseguito dopo la compilazione, ma l'obiettivo è quello di eseguire l'aggancio in un'attività di compilazione stessa, quindi ogni volta che si verifica una compilazione, l'attività foo viene chiamata automaticamente al termine della compilazione.

È possibile o sto seguendo le cose nel modo sbagliato per eseguire il collegamento con l'attività di compilazione integrata?

+0

Puoi spiegare il caso d'uso? –

+0

@MarkHarrah, Play ha una limitazione in cui l'instradamento inverso di javascript per sottoprogetti può essere generato solo in fase di runtime. Ho bisogno dei percorsi generati come file statici in fase di compilazione, cosa che ho ottenuto, ad eccezione dell'aggancio dell'attività come operazione post-compilazione (cioè ho bisogno di compilare prima l'applicazione, altrimenti le nuove rotte non verranno prese in considerazione nel compito di generazione di percorsi). – virtualeyes

+0

Questi file che vengono generati considerano le risorse? –

risposta

13

In generale, alcune attività dipendono dall'attività.

Se compile viene utilizzato per indicare "compilare e impostare le cose per Grunt", quindi creare un'attività prepareGrunt che dipende compile e myTask ed eseguire che invece.

Se deve essere eseguito prima che le classi e le risorse del progetto vengano utilizzate da qualcos'altro, quindi impostarlo come dipendenza da exportedProducts. Attività come run e test e attività in progetti dipendenti otterranno le voci del percorso di classe esportate da tale attività.

Il pericolo in "Esegui dopo la compilazione" è che non verrà eseguito prima dell'attività che ne ha effettivamente bisogno. Esiste il metodo triggeredBy su Initialize[Task[T]], ma è facilmente abusato e dovrebbe essere utilizzato solo quando l'output dell'attività è noto per essere utilizzato solo dopo l'esecuzione di tutte le attività.

+3

+1 grazie Mark, stai facendo un lavoro incredibile con SBT, continua così (non dimenticare di dormire però ;-)) – virtualeyes