2

次のように.scalaビルド定義を設定しています。

object build extends Build {
  lazy val root = Project("main", file(".")) aggregate(benchmark)
  lazy val benchmark = Project("benchmark", file("benchmark"))
}

タスクを実行する前にプロジェクトでre-startタスクを実行する必要があります(そのため、確実にトリガーする必要があります)。そのような依存関係を指定する方法はありますか?mainrunbenchmarkbenchmark/runmain/re-start

編集:解決策を見つけたようですので、誰かが同じ問題に遭遇した場合に備えて、この質問に追加します。アイデアは、reStart タスクのカスタム バージョンを作成し、引数を解析する必要がないため、InputTask ではなく Task にすることです。完全な build.scala は次のとおりです。

import sbt._
import Keys._
import cc.spray.revolver.RevolverPlugin.Revolver._
import cc.spray.revolver.Actions._
import cc.spray.revolver.AppProcess

object build extends Build {
  val noArgs = TaskKey[ExtraCmdLineOptions]("no-args")
  val noArgsTask = TaskKey[ExtraCmdLineOptions]("no-args") := { ExtraCmdLineOptions(Nil, Nil) }
  val reStartCustom = TaskKey[AppProcess]("re-start-custom")

  val reStartTask = reStartCustom <<= (streams, state, reForkOptions, mainClass in reStart, fullClasspath in Runtime, reStartArgs, noArgs in root)
    .map(restartApp)
    .updateState(registerAppProcess)
    .dependsOn(products in Compile)

  lazy val root: Project = Project("main", file("."), settings = Defaults.defaultSettings ++ Seq(noArgsTask, reStartTask)) aggregate(benchmark)
  lazy val benchmark: Project = Project("benchmark", file("benchmark"), settings = Defaults.defaultSettings ++ Seq(
    run in Compile <<= (reStartCustom in root, run in Compile in benchmark) {
      case (mainRestart, benchmarkRun) =>
        benchmarkRun.mapTask { runTask => mainRestart.flatMap(_ => runTask) }
    }
  ))
}
4

1 に答える 1

2

もっといい方法があるかもしれませんが、私の見解は次のとおりです。

import sbt._
import Keys._

object MyKeys {
  val restart = TaskKey[Unit]("re-start")
}

object build extends Build {
  import MyKeys._
  lazy val root: Project = Project("main",
    file("."),
    settings = Defaults.defaultSettings ++ Seq(
      restart := { println("***RESTART***") }
    )
  ) aggregate(benchmark)
  lazy val benchmark: Project = Project(
    "benchmark",
    file("benchmark"),
    settings = Defaults.defaultSettings ++ Seq(
      run  in Compile <<= (restart in root, run in Compile in benchmark){
        case (mainRestart, benchmarkRun) =>
          benchmarkRun.mapTask{ runTask => mainRestart.flatMap{ _ => runTask }
        }
      }
    )
  )
}

このセットアップでsbt "project benchmark" runは、最初にプロジェクトでrestartタスクを実行してから、実際に project で標準コマンドをmain呼び出します。runbenchmark

restart 説明のために TaskKey (および のダミー実装)を追加したことに注意してくださいmain

ご覧のとおり、これはこのような単純な要件には少し複雑に見えますが、(単純な s とは対照的に) s/ s (1 つである) を操作することは常に必要以上にトリッキーであるというのが私の (限られた)InputTask経験InputKeyですrunTask/ TaskKeys の方が扱いやすい)。

于 2012-12-10T11:27:58.230 に答える