2011-12-18 10 views
18

私はPlay FrameworkでSBTを使用しています。これまでのところsbtでテストタスクの前に実行するカスタムタスクを接続する方法は?

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

とても良い:

は、私は私のプロジェクトでのJavaScriptのテストを実行するカスタム TaskKeyを作成しました。

誰かがtestタスクを実行したときに、常にtestJsTaskを実行します。

私は次のように何かする必要があります推測:

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

私はそれが正確に定義されるべきかさっぱりだが。 'test'や 'build'のような既存のタスクに依存関係を追加する方法は?

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

+0

不運Play版で同じことをする方法がわかりません:/それ以上のテストをしようとしますが、成功すればここで報告します。 –

+0

あなたが解決策を見つけたら、私は興味があります。 – 2rs2ts

答えて

14

これは、それを行う1つの方法:

タスクキーを定義します。

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 
    } 

[EDIT ]プロジェクトの設定内でタスクの依存関係を定義する必要があります。 "ノーマル" プロジェクトでは、あなたはそれを次のようにします:

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

どういうわけか、これは私に不完全で間違っています。私がしたいのは、誰かが 'test'コマンドを実行した後、他のすべてのテストを除いてtestJsも実行することを保証することです。また、「:=」記号を一切使用していないことがわかります。これは、タスクを作成するときに必要なことです - あるいは間違っていますか?編集:私はあなたの編集を参照して、今それはより意味をなさない、私はすぐに試してみましょう;) –

+1

あなたはタスクを直接定義することができます:=。私は実際の仕事からタスクキーを分離することができるので、私は他の可能性を好む。 – Christian

+0

私はまだ前と同じ問題があります:Build.scala:19:見つからない:バリューテスト。 [エラー](テストでのテスト)<< =(テストでのテスト)dependsOn(testJsTask) –

10

プレイ2.2.xでは、SBT 0.13(What’s new in Play 2.2を参照)を使用しています。これにより、build.sbt自身でタスクを構成するための新しい手段がもたらされます(project/サブディレクトリのScalaファイルに頼らずに)。

あなたは次のようにbuild.sbtでタスク間の依存関係を定義することができプレイ2.2.xのを使用してしまった場合:

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 
} 

は詳細についてはSBTの公式ドキュメントにTasksを参照してください。

+1

です。順番に、または並行してタスクを実行しますか? – monkjack

+0

順番に。最初のtestJsTask、次にテストタスク。 – htomek

+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

関連する問題