2011-12-18 9 views
18

Sto utilizzando SBT con Play Framework.Come allegare un'attività personalizzata da eseguire prima dell'attività di test in sbt?

ho creato una consuetudine TaskKey per eseguire JavaScript test in mio progetto:

import sbt._ 
import sbt.Process._ 
import PlayProject._ 

object ApplicationBuild extends Build { 

    val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.") := {} 

    val main = PlayProject("xxx", 1.0, Seq()) 
    .settings(defaultScalaSettings: _*) 
    .settings(testJsTask) 
} 

Fin qui tutto bene.

Voglio eseguire questo testJsTask sempre quando qualcuno esegue l'attività test.

Credo che dovrebbe essere qualcosa come segue:

test in Test <<= (test in Test).dependsOn(testJsTask) 

Non ho idea di come dovrebbe essere definito esattamente. Come aggiungere una dipendenza a un'attività esistente come "test" o "build"?

UPDATE

Dopo modifiche proposte dal @Christian la definizione di compilazione appare come segue:

object ApplicationBuild extends Build { 
    val testJsTask = TaskKey[Unit]("testJs", "Run tests for javascript client.") 
    def testJs = {} 

    val main = PlayProject("xxx", 1.0, Seq()) 
    .settings(defaultScalaSettings: _*) 
    .settings(testJsTask := testJs) 

    (test in Test) <<= (test in Test) dependsOn (testJs) 
} 

Purtroppo, la soluzione non funziona neanche:

[error] /xxx/project/Build.scala:21: not found: value test 
[error] (test in Test) <<= (test in Test) dependsOn (testJs) 
[error] ^
[error] one error found 
[error] {file:/xxx/project/}default-f468ae/compile:compile: Compilation failed 
+0

Hai avuto successo? La mia ultima modifica ti ha aiutato? – Christian

+0

Sfortunato Non vedo il modo di fare lo stesso con la versione di Play:/proverò a fare qualche altro test e riferirò qui se ci sarà qualche successo. –

+0

Sono interessato a vedere se hai trovato una soluzione. – 2rs2ts

risposta

14

Questo è un modo per farlo:

Definire la chiave compito:

val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.")  

Definire il compito nelle impostazioni progetti:

testJsTask <<= testJs 

make test dipendono da esso:

(test in Test) <<= (test in Test) dependsOn (testJs) 

testJs possono essere definiti come segue:

def testJs = (streams) map { (s) => { 
    s.log.info("Executing task testJs") 
    // Your implementation 
    } 

[MODIFICA ] Devi definire le dipendenze delle attività all'interno delle impostazioni del progetto. Per un progetto "normale", si dovrebbe farlo nel modo seguente:

lazy val testProject = Project(
    "testProject", 
    file("testProject"), 
    settings = defaultSettings ++ Seq(
     testJsTask <<= testJs, 
     (test in Test) <<= (test in Test) dependsOn (testJsTask) 
    ) 
) 
+1

In qualche modo questo sembra sbagliato incompleta a me. Quello che voglio fare è assicurarsi che quando qualcuno eseguirà il comando 'test', quindi, tranne tutti gli altri test, eseguirà anche testJs. Vedo anche che non hai usato affatto il simbolo ': =', che so è necessario quando creo Task - o sbaglio ?. EDIT: Vedo la tua modifica, ora si comincia ad avere più senso, cercherò subito;) –

+1

È possibile definire direttamente un'attività con: =. Preferisco l'altra possibilità, perché quindi posso separare le chiavi delle attività dalle attività effettive. – Christian

+0

Ho ancora lo stesso problema di prima: Build.scala: 19: non trovato: test del valore. [Error] (test in Test) << = (test in Test) DependsOn (testJsTask) –

10

Giocare 2.2.x utilizza SBT 0,13 (vedi What’s new in Play 2.2). Ciò comporta alcuni nuovi metodi per comporre le attività nello stesso build.sbt (senza ricorrere a un file Scala nella sottodirectory project/).

Se vi capita di usare Giocare 2.2.x si potrebbe definire la dipendenza tra le attività in build.sbt come segue:

lazy val testJsTask = taskKey[Unit]("Run JavaScript tests.") 

testJsTask := { 
    println("Running JavaScript tests...") 
    java.util.concurrent.TimeUnit.SECONDS.sleep(3) 
    println("...done.") 
} 

test in Test := { 
    testJsTask.value 
    (test in Test).value 
} 

Vedi Tasks nella documentazione ufficiale di SBT per maggiori dettagli.

+1

Questo eseguire il attività in sequenza o in concomitanza? – monkjack

+0

sequenzialmente. Primo testJsTask, quindi task di test. – htomek

+1

Per quanto a dire ho capito questo non è corretto @htomek http://www.scala-sbt.org/release/docs/Custom-Settings.html#Execution+semantics+of+tasks Usa 'Def.sequential()' per eseguire attività in ordine http://www.scala-sbt.org/release/docs/Howto-Sequencing.html – trudolf

Problemi correlati