2011-12-18 15 views
18

Estoy usando SBT con Play Framework.¿Cómo adjuntar una tarea personalizada para ejecutar antes de la tarea de prueba en sbt?

creé una costumbre TaskKey para ejecutar JavaScript pruebas en mi proyecto:

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

Hasta aquí todo bien.

Quiero ejecutar este testJsTask siempre cuando alguien ejecuta la tarea test.

supongo que debe ser algo de la siguiente manera:

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

no tengo idea de cómo debe definirse con exactitud. ¿Cómo agregar una dependencia a una tarea existente como 'prueba' o 'compilación'?

ACTUALIZACIÓN

Después de los cambios propuestos por @Christian la definición de construcción se ve de la siguiente manera:

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

Desafortunadamente, la solución no funciona bien:

[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

¿Has sido exitoso? ¿Te ayudó mi última edición? – Christian

+0

Mala suerte No veo la manera de hacer lo mismo con la versión Play:/Intentaré hacer algunas pruebas más e informaré aquí si hay algún éxito. –

+0

Me interesa ver si encontraste una resolución. – 2rs2ts

Respuesta

14

Este es Una forma de hacerlo:

Define la tecla tarea:

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

Definir la tarea en la configuración de proyectos: depende

testJsTask <<= testJs 

prueba de maquillaje en él:

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

testJs se puede definir de la siguiente manera:

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

[EDITAR ] Debe definir las dependencias de tareas dentro de la configuración del proyecto. Para un proyecto "normal", que lo haría de la siguiente manera:

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

De alguna manera esto parece incorrecto en incompleto para mí. Lo que quiero hacer es asegurarme de que cuando alguien ejecute el comando 'prueba', entonces, a excepción de todas las demás pruebas, ejecutará también testJs. También veo que no usaste el símbolo ': =' en absoluto, y sé que es necesario para crear Tareas, ¿o estoy equivocado? EDIT: Veo tu edición, ahora comienza a tener más sentido, voy a tratar de inmediato;) –

+1

Se pueden definir directamente una tarea con: =. Prefiero la otra posibilidad, porque entonces puedo separar las teclas de tareas de las tareas reales. – Christian

+0

Todavía tengo el mismo problema que antes: Build.scala: 19: no encontrado: prueba de valor. [Error] (test en la Condición) << = (test en la Condición) DependsOn (testJsTask) –

10

Juego 2.2.x utiliza SBT 0,13 (ver What’s new in Play 2.2). Eso trae algunos nuevos medios para componer tareas en el propio build.sbt (sin recurrir a un archivo Scala en el subdirectorio project/).

Si usted usa Juego 2.2.x se podría definir la dependencia entre las tareas en build.sbt de la siguiente manera:

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 
} 

Ver Tasks en la documentación oficial del SBT para más detalles.

+1

¿Esto ejecuta el tareas secuencialmente o concurrentemente? – monkjack

+0

Secuencialmente. Primero testJsTask, luego prueba la tarea. Por lo – htomek

+1

es que entiendo para esto no es correcto @htomek http://www.scala-sbt.org/release/docs/Custom-Settings.html#Execution+semantics+of+tasks Use 'Def.sequential()' ejecutar tareas en orden http://www.scala-sbt.org/release/docs/Howto-Sequencing.html – trudolf

Cuestiones relacionadas