どのようにsbtのテストタスクの前に実行するカスタムタスクを添付するには?

私はPlay FrameworkでSBTを使用しています。

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

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)

どのようにしてそれを正確に定義すべきかわかりません。 'test'や 'build'のような既存のタスクに依存関係を追加する方法は?

更新

@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
18
あなたが解決策を見つけたかどうかを知りたいです。
追加された 著者 2rs2ts,
あなたは成功しましたか?最新の編集があなたを助けてくれましたか?
追加された 著者 Christian,
将来の読者のために:(Test in Test):=(Test in Test).dependsOn(otherTask).value は私のために働く
追加された 著者 trudolf,
不運なことに、私はPlay版で同じことをする方法を見ません:/私はいくつかのテストをやろうとします、そして、もし成功すればここで報告します。
追加された 著者 Piotr Kukielka,

2 答え

これはこれを行う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
  }

[編集]プロジェクトの設定内でタスクの依存関係を定義する必要があります。にとって 「通常の」プロジェクトでは、次のようにします。

  lazy val testProject = Project(
    "testProject",
    file("testProject"),
    settings = defaultSettings ++ Seq(
      testJsTask <<= testJs,
      (test in Test) <<= (test in Test) dependsOn (testJsTask)
    )
  )
14
追加された
タスクを直接定義するには、=を使用します。私は実際の仕事からタスクキーを分離することができるので、私は他の可能性を好む。
追加された 著者 Christian,
現在のビルドスクリプトを投稿できますか?
追加された 著者 Christian,
私はプレイフレームワークを使用したことはありませんが、PlayProjectにはテストがありません。
追加された 著者 Christian,
どういうわけか、これは私に不完全で間違っています。私がしたいのは、誰かが 'test'コマンドを実行した後、他のすべてのテストを除いてtestJsも実行することを保証することです。また、「:=」記号を一切使用していないことがわかります。これは、タスクを作成するときに必要なことです - あるいは間違っていますか?編集:私はあなたの編集を参照して、今それはもっと意味をなさないために開始、私はすぐにそれを試してみましょう;)
追加された 著者 Piotr Kukielka,
私はまだ前と同じ問題があります:Build.scala:19:見つからない:値のテスト。 [エラー](テストのテスト)<< =(テストのテスト)dependsOn(testJsTask)
追加された 著者 Piotr Kukielka,
PlayProjectのソースコードでは、不運なテスト(btw。 github.com/playframework/Play20/wiki/SettingsSBT )。また、私は最初の投稿を編集しました。
追加された 著者 Piotr Kukielka,
この回答は古くなっています。 SBT 1.1.0-RC1では、 testJs に依存する test を作るためのキーラインは、(Test/test):=((Test/test )dependsOn testJs).value
追加された 著者 arussell84,

Play 2.2.xはSBT 0.13を使用します( Play 2.2の新機能)。これは、( project/サブディレクトリのScalaファイルに頼らずに) build.sbt 自体でタスクを構成する新しい手段をもたらします。

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
}

詳細については、SBTの公式文書のタスクを参照してください。

12
追加された
これは、タスクを順次または同時に実行しますか?
追加された 著者 monkjack,
これまでのところ、これは正しくないと私は理解しています@htomek scala-sbt.org/release/docs/… Def.sequential()を使用して、 scala-sbt.org/release/docs/Howto-Sequencing.html
追加された 著者 trudolf,
逐次的に。最初のtestJsTask、次にテストタスク。
追加された 著者 htomek,