【问题标题】:How to define arbitrary tasks in the Play Framework? (like ruby rake)如何在 Play Framework 中定义任意任务? (如红宝石耙)
【发布时间】:2012-01-12 09:58:02
【问题描述】:

如何在 Play Framework 中定义任意任务?

我的意思是任务从命令行运行,类似于 ruby​​ rake。

我知道 ant 工具,但正在寻找更好的替代方案。

【问题讨论】:

  • 你想运行什么样的任务?如果你需要它用于建筑目的,玩它是相当不错的。您不必需要任何其他工具。但是,如果您需要安排一些任务,例如邮件发送、重新索引等等,您可以在 Play 中使用 Job 类。
  • 各类非标准任务:生成asciidoc文档、数据库初始化和迁移、非标准自动化测试等
  • "tasks" 有点模棱两可,尽管在 rake 中是这样称呼它们的。在玩!它们是“命令”

标签: playframework rake


【解决方案1】:

对于 Play 2,您可以按照此处的文档使用 SBT 创建新任务:

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

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

【讨论】:

【解决方案2】:

[编辑] 此答案适用于 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

基本上你定义你想要的命令并从“执行”方法启动它们,例如:

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! module documentation 在这方面非常有限

编辑

我想补充一点信息:

在能够执行您的命令之前,您必须构建您的模块。它不像其他的动态编译那样运行。

play build-module mymodule

new-module/build-module 期望模块位于项目文件夹的根目录,但如果你有很多,就会变得一团糟。 build-module module-srcs/mymodule 工作得很好。

【讨论】:

  • 谢谢斯特凡诺。这看起来真的像“The Play 1.2.4 Way”来定义自定义任务。不幸的是,AFAIK Python 将在 Play 2.0 中被抛弃。那我需要用 Scala 重写我的命令吗?
  • @qertoip 不幸玩了! 2.0 仍处于早期阶段 - 但正如 in this SO question 所说,模块实际上应该更容易编写。如果您的命令主要以 java 形式编写,您应该能够在 2.0 投入生产后完全重用它——这不会很快发生,而且您可能需要做很多额外的工作来调整整个应用程序,而不是重写你的命令:)
  • @qertoip 哦,我没有注意到您评论中的“in Scala”,抱歉!别担心,玩! 2.0 并没有放弃 Java! Java, on the other hand, is certainly not getting any less support from Play 2.0; quite the contrary. The Play 2.0 build provides us with an opportunity to enhance the development experience for Java developers.来自这个official announcement
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多