2011-12-18 37 views
18

Tôi đang sử dụng SBT với Play Framework.Cách đính kèm tác vụ tùy chỉnh để thực thi trước khi thực hiện nhiệm vụ kiểm tra trong sbt?

Tôi tạo ra một phong tục TaskKey chạy JavaScript kiểm tra trong dự án của tôi:

import sbt._ 
import sbt.Process._ 
import PlayProject._ 

object ApplicationBuild extends Build { 

    val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.") := {} 

    val main = PlayProject("xxx", 1.0, Seq()) 
    .settings(defaultScalaSettings: _*) 
    .settings(testJsTask) 
} 

Cho đến nay rất tốt.

Tôi muốn chạy này testJsTask luôn khi ai đó thực hiện tác vụ test.

Tôi đoán nó phải được một cái gì đó như sau:

test in Test <<= (test in Test).dependsOn(testJsTask) 

Tôi không biết làm thế nào nó cần được xác định một cách chính xác. Làm thế nào để thêm một phụ thuộc vào một nhiệm vụ hiện có như 'test' hoặc 'build'?

CẬP NHẬT

Sau khi thay đổi bằng cách @Christian đề xuất định nghĩa xây dựng trông như sau:

object ApplicationBuild extends Build { 
    val testJsTask = TaskKey[Unit]("testJs", "Run tests for javascript client.") 
    def testJs = {} 

    val main = PlayProject("xxx", 1.0, Seq()) 
    .settings(defaultScalaSettings: _*) 
    .settings(testJsTask := testJs) 

    (test in Test) <<= (test in Test) dependsOn (testJs) 
} 

Thật không may, giải pháp không làm việc, hoặc:

[error] /xxx/project/Build.scala:21: not found: value test 
[error] (test in Test) <<= (test in Test) dependsOn (testJs) 
[error] ^
[error] one error found 
[error] {file:/xxx/project/}default-f468ae/compile:compile: Compilation failed 
+0

Bạn đã thành công chưa? Bản chỉnh sửa mới nhất của tôi có giúp bạn không? – Christian

+0

Không may mắn tôi không thấy cách làm tương tự với phiên bản Play:/Tôi sẽ cố gắng thực hiện thêm vài bài kiểm tra nữa và tôi sẽ báo cáo ở đây nếu có thành công nào. –

+0

Tôi quan tâm để xem bạn có tìm thấy giải pháp hay không. – 2rs2ts

Trả lời

14

Đây là một cách để làm điều đó:

Xác định chủ chốt nhiệm vụ:

val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.")  

Xác định nhiệm vụ trong môi trường các dự án của bạn:

testJsTask <<= testJs 

Make kiểm tra phụ thuộc vào nó:

(test in Test) <<= (test in Test) dependsOn (testJs) 

testJs thể được định nghĩa như sau:

def testJs = (streams) map { (s) => { 
    s.log.info("Executing task testJs") 
    // Your implementation 
    } 

[EDIT ] Bạn phải xác định các phụ thuộc nhiệm vụ trong các thiết lập dự án. Đối với một "bình thường" dự án, bạn sẽ làm điều đó theo cách sau:

lazy val testProject = Project(
    "testProject", 
    file("testProject"), 
    settings = defaultSettings ++ Seq(
     testJsTask <<= testJs, 
     (test in Test) <<= (test in Test) dependsOn (testJsTask) 
    ) 
) 
+1

Bằng cách nào đó điều này có vẻ sai khi không đầy đủ với tôi. Những gì tôi muốn làm là đảm bảo, rằng khi ai đó sẽ chạy lệnh 'test', thì ngoại trừ tất cả các test khác, nó sẽ thực hiện testJs. Ngoài ra tôi thấy bạn không sử dụng biểu tượng ': =' chút nào, điều mà tôi biết là cần thiết khi xây dựng Nhiệm vụ - hoặc tôi có sai không ?. EDIT: Tôi thấy chỉnh sửa của bạn, bây giờ nó bắt đầu có ý nghĩa hơn, tôi sẽ thử nó ngay lập tức;) –

+1

Bạn có thể trực tiếp xác định một nhiệm vụ với: =. Tôi thích khả năng khác, bởi vì sau đó tôi có thể tách các phím nhiệm vụ khỏi các nhiệm vụ thực tế. – Christian

+0

Tôi vẫn có cùng một vấn đề như trước: Build.scala: 19: không tìm thấy: kiểm tra giá trị. [lỗi] (kiểm tra trong bài kiểm tra) << = (kiểm tra trong bài kiểm tra) dependsOn (testJsTask) –

10

Chơi 2.2.x sử dụng SBT 0,13 (xem What’s new in Play 2.2). Điều đó mang lại một số phương tiện mới để soạn nhiệm vụ theo số build.sbt chính nó (mà không cần đến một tệp Scala trong thư mục con project/).

Nếu bạn tình cờ sử dụng Chơi 2.2.x bạn có thể xác định sự phụ thuộc giữa các nhiệm vụ trong build.sbt như sau:

lazy val testJsTask = taskKey[Unit]("Run JavaScript tests.") 

testJsTask := { 
    println("Running JavaScript tests...") 
    java.util.concurrent.TimeUnit.SECONDS.sleep(3) 
    println("...done.") 
} 

test in Test := { 
    testJsTask.value 
    (test in Test).value 
} 

Xem Tasks trong tài liệu chính thức của SBT để biết thêm chi tiết.

+1

Điều này có chạy không nhiệm vụ tuần tự hoặc đồng thời? – monkjack

+0

Tuần tự. TestJsTask đầu tiên, sau đó kiểm tra nhiệm vụ. – htomek

+1

Theo tôi, điều này không đúng @htomek http://www.scala-sbt.org/release/docs/Custom-Settings.html#Execution+semantics+of+tasks Sử dụng 'Def.sequential()' để chạy các tác vụ theo thứ tự http://www.scala-sbt.org/release/docs/Howto-Sequencing.html – trudolf

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