簡體   English   中英

如何在Play框架中定義任意任務? (如紅寶石耙)

[英]How to define arbitrary tasks in the Play Framework? (like ruby rake)

如何在Play框架中定義任意任務?

我的意思是任務從命令行運行,類似於ruby rake。

我知道螞蟻工具,但正在尋找更好的選擇。

對於Play 2,您可以按照以下文檔使用SBT創建新任務:

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

在Play 2生成的Build.scala ,它可能看起來像這樣:

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

[編輯] 這個答案適用於Play 1. *系列!

您應該編寫一個自定義模塊,然后將命令放入commands.py文件中,參考: http : //www.playframework.org/documentation/1.2.4/releasenotes-1.1#commands

您可以查看現有模塊以獲取啟發,例如: https : //github.com/sim51/logisima-play-yml/blob/master/commands.py

基本上,您定義所需的命令,然后從“ execute”方法啟動它們,例如:

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

如果您想啟動Java,通常是這樣! -:

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

附言

創建自定義模塊很容易:

play new-module mymodule

這是入門書籍: http : //playframework.wordpress.com/2011/02/27/play-modules/ ,考慮到該官方Play! 在這方面模塊文檔非常有限

編輯

我以為我會補充一點信息:

在能夠執行命令之前,必須先構建模塊。 它與動態編譯的其余部分不同。

play build-module mymodule

new-module / build-module期望模塊位於項目文件夾的根目錄,但是如果您有很多模塊,那將是一團糟。 build-module module-srcs/mymodule可以正常工作。

我們正在使用Play Jobs執行此類任務。

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

} 

要么

諸如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.");
    }
}

}

看一下播放文件: http : //www.playframework.org/documentation/1.2.4/jobs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM