2012-01-12 27 views
8

Cách xác định các tác vụ tùy ý trong Khung Chơi?Cách xác định các tác vụ tùy ý trong Khung chơi? (giống như cào ruby)

Tôi có nghĩa là các tác vụ chạy từ dòng lệnh, một cái gì đó tương tự như cào ruby.

Tôi biết công cụ kiến ​​nhưng tìm kiếm giải pháp thay thế tốt hơn.

+0

Loại tác vụ nào bạn muốn chạy? Nếu bạn cần nó cho mục đích xây dựng chơi là khá tốt về nó. Bạn không cần bất kỳ công cụ nào khác. Nhưng nếu bạn cần lập kế hoạch cho một số nhiệm vụ như gửi thư, reindexing vs .. bạn có thể sử dụng lớp Job trong Play. – Luffy

+0

Tất cả các loại nhiệm vụ không chuẩn: tạo tài liệu asciidoc, khởi tạo cơ sở dữ liệu và di chuyển, kiểm tra tự động không chuẩn, v.v. – qertoip

+0

"tác vụ" hơi mơ hồ, mặc dù trong cào là cách chúng được gọi. Trong Play! họ là "lệnh" – Stefano

Trả lời

3

[sửa]Câu trả lời này dành cho Play 1. * series!

Bạn nên viết một module tùy chỉnh, sau đó lệnh của bạn đi vào commands.py tập tin, ref: http://www.playframework.org/documentation/1.2.4/releasenotes-1.1#commands

Bạn có thể nhìn vào các module hiện có để có được cảm hứng, ví dụ như: https://github.com/sim51/logisima-play-yml/blob/master/commands.py

Về cơ bản bạn định nghĩa các lệnh bạn muốn và khởi chạy chúng từ phương thức "thực hiện", ví dụ:

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

nếu bạn muốn khởi chạy một cái gì đó java - thường là trường hợp! -:

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.

tạo ra một mô-đun tùy chỉnh dễ dàng như:

play new-module mymodule 

Đây là một mồi: http://playframework.wordpress.com/2011/02/27/play-modules/, xem xét rằng chính thức Play! module documentation là khá hạn chế ở khía cạnh đó

chỉnh sửa

tôi nghĩ Tôi muốn thêm một chút thông tin:

befor e có thể thực hiện các lệnh của bạn, bạn phải BUILD mô-đun của bạn. Nó không chạy như phần còn lại của vở kịch với một biên dịch năng động.

play build-module mymodule 

mô-đun mới/mô-đun xây dựng mong muốn mô-đun nằm ở gốc thư mục dự án, nhưng nếu bạn có nhiều thứ trở thành mớ hỗn độn. build-module module-srcs/mymodule hoạt động hoàn toàn tốt.

+0

Cảm ơn Stefano. Điều này thực sự trông giống như "The Play 1.2.4 Way" để xác định các tác vụ tùy chỉnh. Thật không may, AFAIK Python sẽ bị hủy trong Play 2.0. Tôi có phải viết lại các lệnh của mình trong Scala không? – qertoip

+1

@qertoip unluckily Play! 2.0 vẫn còn ở giai đoạn rất sớm - nhưng như đã nói [trong câu hỏi SO này] (http://stackoverflow.com/questions/8044991/how-to-contribute-modules-in-play-framework-2-0) các mô-đun nên thực sự dễ viết hơn. Nếu viết lệnh của bạn chủ yếu là java, bạn sẽ có thể sử dụng lại nó hoàn toàn một lần 2.0 để sản xuất - không sớm xảy ra, và có lẽ bạn sẽ có nhiều công việc bổ sung để thích ứng với toàn bộ ứng dụng của mình, hơn là viết lại lệnh của bạn :) – Stefano

+0

@qertoip oh, tôi đã không nhận thấy "trong Scala" trong bình luận của bạn, xin lỗi! Đừng lo lắng, chơi! 2.0 là không bỏ qua Java! 'Java, mặt khác, chắc chắn không nhận được bất kỳ sự hỗ trợ ít hơn từ Play 2.0; hoàn toàn ngược lại. Bản dựng Play 2.0 cung cấp cho chúng tôi một cơ hội để nâng cao trải nghiệm phát triển cho Java nhà phát triển.' từ [thông báo chính thức] này (http://groups.google.com/group/play-framework/browse_thread/thread/8cdca8216bffc464) – Stefano

0

Chúng tôi đang sử dụng Play Jobs cho loại nhiệm vụ đó.

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

} 

hoặc

Bootstrap việc làm cho công việc như 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."); 
    } 
} 

}

Có một cái nhìn vở kịch tài liệu: http://www.playframework.org/documentation/1.2.4/jobs

+0

Điều này chắc chắn không trả lời câu hỏi – Stefano

6

Đối Chơi 2, bạn có thể tạo các nhiệm vụ mới sử dụng SBT, bằng cách làm theo tài liệu ở đây:

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

Trong bối cảnh Play 2 tạo Build.scala, nó có thể trông như thế này:

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

Cảm ơn bạn James. Dựa trên lời khuyên của bạn, tôi đã viết xuống mã mẫu tải ứng dụng trong nhiệm vụ SBT trên [blog của tôi] (http://kailuowang.blogspot.com/2013/05/define-arbitrary-tasks-in-play-21.html) – KailuoWang

+0

bạn có nhớ xem http://stackoverflow.com/questions/22447100/cant-get-access-to-a-projects-classes-objects-from-build-scala này không? –

Các vấn đề liên quan