2011-12-18 55 views
18

我正在使用SBT和Play框架。如何在sbt中的測試任務之前附加自定義任務執行?

我創建了一個自定義的TaskKey運行在我的項目的JavaScript測試:

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

到目前爲止好。

我想在某人執行test任務時始終運行此testJsTask任務。

我想這應該是如下:

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

我不知道應該如何精確定義。如何將依賴項添加到現有任務,如「測試」或「構建」?

UPDATE

後@Christian提出更改的構建定義如下所示:

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

不幸的是,該解決方案無法正常工作或:

[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

你成功了嗎?我的最新編輯有幫助你嗎? – Christian 2011-12-21 09:23:44

+0

不幸的是,我沒有看到與Play版本相同的方式:/我會嘗試做更多的測試,如果會有任何成功,我會在這裏報告。 – 2011-12-23 08:35:38

+0

我很想看看您是否找到了解決方案。 – 2rs2ts 2015-07-01 18:31:48

回答

14

這是一種方法:

定義任務鍵:

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

定義任務在項目設置:

testJsTask <<= testJs 

製作測試依賴於它:

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

testJs可以被定義如下:

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

[編輯]您必須在項目設置中定義任務依賴關係。對於 一個 「正常」 的項目,你會做下列方式:

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

不知何故,這對我來說看起來不完整。我想要做的是確保當有人運行「測試」命令時,除了所有其他測試外,它還會執行testJs。另外我看到你沒有使用':='符號,我知道在構建任務時需要使用符號 - 或者我錯了嗎?編輯:我看到你的編輯,現在它開始變得更有意義,我會馬上嘗試;) – 2011-12-19 07:13:23

+1

你可以直接用:=定義一個任務。我更喜歡其他的可能性,因爲我可以將任務鍵與實際任務分開。 – Christian 2011-12-19 07:19:01

+0

我仍然遇到與以前相同的問題:Build.scala:19:未找到:值測試。 [錯誤](在測試中測試)<< =(在測試中測試)dependsOn(testJsTask) – 2011-12-19 07:19:19

10

播放2.2.x中使用SBT 0.13(見What’s new in Play 2.2)。這爲build.sbt本身帶來了一些創作任務的新方法(無需使用project/子目錄中的Scala文件)。

如果你碰巧使用Play 2.2.x中你可以定義任務之間的相關性在build.sbt如下:

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 
} 

詳情請參閱Tasks SBT的官方文檔。

+1

這是否運行任務順序或同時進行? – monkjack 2014-08-13 16:30:42

+0

依次。先測試任務,然後測試任務。 – htomek 2016-01-21 10:14:12

+1

據我所知,這是不正確的@htomek http://www.scala-sbt.org/release/docs/Custom-Settings.html#Execution+semantics+of+tasks 使用'Def.sequential()'按順序運行任務http://www.scala-sbt.org/release/docs/Howto-Sequencing.html – trudolf 2017-01-24 05:39:18

相關問題