2012-01-12 16 views
8

¿Cómo se definen las tareas arbitrarias en Play Framework?¿Cómo se definen las tareas arbitrarias en Play Framework? (como rastrillo ruby)

Quiero decir que las tareas se ejecutan desde la línea de comandos, algo similar a rastrillo ruby.

Conozco la herramienta Ant pero estoy buscando una mejor alternativa.

+0

¿Qué tipo de tareas desea ejecutar? Si lo necesitas para construir, el juego es bastante bueno. No necesita ninguna otra herramienta. Pero si necesita programar algunas tareas como el envío de correo, reindexar vs ... puede usar la clase de trabajo en Play. – Luffy

+0

Todo tipo de tareas no estándar: generación de documentación asciidoc, inicialización de base de datos y migraciones, pruebas automáticas no estándar, etc. – qertoip

+0

"tareas" es un poco ambiguo, aunque en rastrillo así es como se llaman. ¡En juego! son "comandos" – Stefano

Respuesta

3

[editar]¡Esta respuesta es para la serie Play 1. *!

Usted debe escribir un módulo personalizado, a continuación, los comandos de entrar en el commands.py archivo, ref: http://www.playframework.org/documentation/1.2.4/releasenotes-1.1#commands

Usted puede mirar en módulos existentes para inspirarse, por ejemplo: https://github.com/sim51/logisima-play-yml/blob/master/commands.py

Básicamente se definen los comandos que desee y su lanzamiento desde el método de "ejecutar", por ejemplo:

COMMANDS = ['namespace:command'] 

def execute(**kargs): 
    command = kargs.get("command") 
    app = kargs.get("app") 
    args = kargs.get("args") 
    env = kargs.get("env") 

    if command == "namespace:command": 
     do_something() 

si usted quiere poner en marcha algo java - a menudo el caso! -:

def do_something(): 
    java_cmd = app.java_cmd([], None, "play.modules.mymodule.MyClass", args) 
     try: 
      subprocess.call(java_cmd, env=os.environ) 
     except OSError: 
      print "Could not execute the java executable, please make sure the JAVA_HOME environment variable is set properly (the java executable should reside at JAVA_HOME/bin/java). " 
      sys.exit(-1) 
     print 

Ps.

crear un módulo personalizado es tan fácil como:

play new-module mymodule 

Esta es una imprimación: http://playframework.wordpress.com/2011/02/27/play-modules/, teniendo en cuenta que oficial Play! module documentation es bastante limitado en ese sentido

edición

pensé Agregaría una pequeña información:

befor Si puede ejecutar sus comandos, debe CONSTRUIR su módulo. No funciona como el resto del juego con una compilación dinámica.

play build-module mymodule 

nuevo módulo/módulo de acumulación de esperar que el módulo sea en la raíz de la carpeta del proyecto, pero si usted tiene muchos que se convierte en un desastre. build-module module-srcs/mymodule funciona perfectamente bien.

+0

Gracias Stefano. Esto realmente se parece a "The Play 1.2.4 Way" para definir tareas personalizadas. Desafortunadamente, AFAIK Python será abandonado en Play 2.0. ¿Tendré que volver a escribir mis comandos en Scala? – qertoip

+1

@qertoip desafortunadamente ¡Jugar! 2.0 todavía está en una etapa muy temprana, pero como dijo [en esta pregunta SO] (http://stackoverflow.com/questions/8044991/how-to-contribute-modules-in-play-framework-2-0) los módulos deberían ser realmente más fácil de escribir Si escribes tu comando principalmente como java, deberías poder reutilizarlo por completo una vez que 2.0 esté listo para producción, lo que no sucederá pronto, y probablemente tendrás mucho trabajo adicional para adaptar toda tu aplicación, más que reescribir su comando :) – Stefano

+0

@qertoip oh, no noté el "en Scala" en su comentario, lo siento! No te preocupes, ¡juega! ¡2.0 NO está abandonando Java! 'Java, por otro lado, ciertamente no recibe menos soporte de Play 2.0; todo lo contrario. La compilación Play 2.0 nos proporciona una oportunidad para mejorar la experiencia de desarrollo para los desarrolladores de Java . De este [anuncio oficial] (http://groups.google.com/group/play-framework/browse_thread/thread/8cdca8216bffc464) – Stefano

0

Estamos utilizando Play Jobs para ese tipo de tareas.

@Every("1h") 
public class WelcomeUser extends Job { 

public void doJob() { 
    List<User> newUsers = User.find("newAccount = true").fetch(); 
    for(User user : newUsers) { 
     Notifier.sayWelcome(user); 
    } 
} 

} 

o

trabajo Bootstrap para tareas como db_migration:

@OnApplicationStart 
public class Bootstrap extends Job { 

public void doJob() { 
    if(Page.count() == 0) { 
     new Page("root").save(); 
     Logger.info("The page tree was empty. A root page has been created."); 
    } 
} 

}

disponer de una mirada documentos: http://www.playframework.org/documentation/1.2.4/jobs

+0

Esto seguramente no responde a la pregunta – Stefano

6

para el juego 2, se pueden crear nuevas tareas utilizando SBT, siguiendo la documentación aquí:

http://www.scala-sbt.org/release/docs/Detailed-Topics/Tasks

En el contexto de un juego 2 generado Build.scala, que podría tener este aspecto:

import sbt._ 
import Keys._ 
import play.Project._ 

object ApplicationBuild extends Build { 

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

    val appDependencies = Seq(
    // Add your project dependencies here, 
    jdbc, 
    anorm 
) 

    val hello = TaskKey[Unit]("hello", "Prints 'Hello World'") 

    val helloTask = hello := { 
    println("Hello World") 
    } 

    lazy val main = play.Project(appName, appVersion, appDependencies).settings(
    helloTask 
) 
} 
+1

Gracias James. De acuerdo con su consejo, anoté el código de muestra que carga la aplicación en la tarea SBT en [mi blog] (http://kailuowang.blogspot.com/2013/05/define-arbitrary-tasks-in-play-21.html) – KailuoWang

+0

¿te importaría echar un vistazo a este http://stackoverflow.com/questions/22447100/cant-get-access-to-a-projects-classes-objects-from-build-scala? –