2011-09-13 17 views
5

Quiero definir una tarea, que invoca tareas de compilación y packageBin, y luego hace sus cosas. ¿Cómo puedo hacer eso? Actualmente esto solo hace la segunda parte y omite las tareas de compilación & packageBin.¿Cómo depender de otras tareas y hacer tu código en SBT 0.10?

lazy val dist = TaskKey[Unit](
    "dist", "Creates a project distribution in dist/ folder." 
) 
def distTask = { 
    dist <<= dist.dependsOn(compile, packageBin) 
    dist <<= (update, crossTarget).map { case (updateReport, out) => 
    updateReport.allFiles.foreach { srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified=true) 
    } 
    } 
} 
+0

En lo que respecta a una solución que pude utilizar ~; compilar; paquete; tarea de dist – arturaz

Respuesta

3

<<= es un método en TaskKey que devuelve un valor. No actualiza el estado mutable en ninguna parte, por lo que en el código de ejemplo, el resultado de la primera llamada se descarta. Para arreglar esto, declara packageBin como una entrada también, pero ignora el valor resultante. Tenga en cuenta que packageBin depende de la compilación, por lo que depender de la compilación no es necesario.

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) => 

Es poco probable que desea copiar todos los archivos en un UpdateReport a un directorio basado únicamente en el nombre del archivo. Es posible que diferentes dependencias tengan el mismo nombre de archivo. Además, esto incluirá dependencias de todas las configuraciones, incluidas las dependencias de prueba.

Para el primer problema, utilice el ModuleID asociado para construir la ruta en el directorio de destino, como se hace en el directorio lib_managed cuando retrieveManaged := true. Para el segundo problema, solo seleccione los archivos para la configuración que desee.

updateReport.matching(configurationFilter(Runtime.name)).foreach... 

Ver las sbt.UpdateReport y sbt.RichUpdateReport docs API para otros métodos útiles.

Si no está preocupado por las colisiones de nombre de archivo, puede obtener los archivos de dependencia de dependencyClasspath. Por ejemplo:

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) => 

y obtener el Seq[File] de cp.files.

+0

Gracias por la gran respuesta. Sin embargo, cuando intento agregar packageBin como dependencia, obtengo esto: [error] sbt.Init $ Uninitized: referencia a la configuración no inicializada {file:/home/arturas/work/spacegame/server/vendor/SpaceMule /} SpaceMule/*: paquete de {file:/home/arturas/work/spacegame/server/vendor/SpaceMule /} SpaceMule/*: dist [error] Use 'last' para el registro completo. – arturaz

+0

¿Incluyó la pieza 'in Compile'? –

+1

Oh, debo haberlo perdido. Funciona ahora, gracias :) – arturaz

Cuestiones relacionadas