2012-03-23 26 views
8

Estoy trabajando en una tarea sbt y me gustaría tener acceso a algunas de las clases de aplicaciones y dependencias. (Específicamente, me gustaría generar el Database DDL usando scalaquery)sbt Tarea classpath

¿Hay alguna manera de agregar esas dependencias a la tarea o tal vez necesito crear un complemento para esto?

object ApplicationBuild extends Build { 

    val appName = "test" 
    val appVersion = "1.0-SNAPSHOT" 

    val appDependencies = Seq(
    "org.scalaquery" % "scalaquery_2.9.0-1" % "0.9.5") 

    val ddl = TaskKey[Unit]("ddl", "Generates the ddl in the evolutions folder") 

    val ddlTask = ddl <<= (baseDirectory, fullClasspath in Runtime) map { (bs, cp) => 
    val f = bs/"conf/evolutions/default" 

    // Figures out the last sql number used 
    def nextFileNumber = { ... } 

    //writes to file 
    def printToFile(f: java.io.File)(op: java.io.PrintWriter => Unit) { ...} 

    def createDdl = { 
     import org.scalaquery.session._ 
     import org.scalaquery.ql._ 
     import org.scalaquery.ql.TypeMapper._ 

     import org.scalaquery.ql.extended.H2Driver.Implicit._ 
     import org.scalaquery.ql.extended.{ ExtendedTable => Table } 
     import models._ 
     printToFile(new java.io.File(nextFileNumber, f))(p => { 
      models.Table.ddl.createStatements.foreach(p.println) 
     }); 
    } 
    createDdl 
    None 
    } 

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
    ddlTask) 

} 

El error que consigo es

[test] $ reload 
[info] Loading global plugins from /home/asal/.sbt/plugins 
[info] Loading project definition from /home/asal/myapps/test/project 
[error] /home/asal/myapps/test/project/Build.scala:36: object scalaquery is not a member of package org 
[error]  import org.scalaquery.session._ 
[error]    ^
[error] one error found 

Gracias de antemano

+4

Intenta agregar la dependencia a 'project/plugins.sbt'. – leedm777

Respuesta

5

hay que añadir ScalaQuery y todo lo demás depende de su construcción como una dependencia de construcción. Eso significa que, básicamente, debes agregarlo "como un plugin sbt".

Esto se describe con cierto detalle en la sección Using Plugins de la wiki sbt. Todo se reduce a una cosa muy simple, sin embargo - sólo tiene que añadir una línea de definición de su cargo en virtud de project/plugins.sbt así:

libraryDependencies += "org.scalaquery" % "scalaquery_2.9.0-1" % "0.9.5" 

Ahora, el problema con el uso de clases de la aplicación en la construcción es que realmente no se puede agregue productos de compilación como dependencias de compilación. - Entonces, probablemente tendrías que crear un proyecto separado que construya tu módulo DDL, y agregar eso como dependencia a la construcción de este proyecto.

+0

disculpa por comentar después de tanto tiempo, pero parece que no puedo usar las clases de scala del proyecto de origen en la tarea (que import_models_ no funciona). ¿Alguna idea de lo que podría ser? – mericano1

+0

Tienes razón. Si su compilación depende de las clases de su aplicación, también deberá agregarlas como dependencias de compilación. Sucio. Adaptaré mi respuesta ... –

Cuestiones relacionadas