2013-11-21 11 views
13

私は私の仕事の中runTaskを呼び出そうとし、これが働くだろうと考えています:まあ、それはない、SBTタスクから別のタスクを呼び出すにはどうすればよいですか?

name := "hello" 

version := "1.0" 

scalaVersion := "2.10.2" 

lazy val hello = taskKey[Unit]("executes hey") 

lazy val helloTask = hello <<= runTask(fullClasspath, "sample.Hey" in run, runner in run) 

しかし。どのように私はこれを行うことができるかに関する任意のアイデア?

答えて

21

一般的な答え:

あなたの一般的な質問に答えるために、解決策は、あなたのタスクは他のタスクに依存することです。 (0.13風の構文で)、このような作業をあなたが依存などの依存システム、並列実行システム、走り回っ終了を行うと、呼び出しますタスクを直接呼び出す:

myTask := { 
    ... 
    val result = otherTask.value 
    ... 
} 

otherTaskをその依存関係が表示されるmyTaskの本文のポイントではなく、myTaskが開始される前に呼び出されます。依存関係がどのように機能するのかが分かるからです。

「通常の」方法が不適切または不適切な場合は、タスクの宣言とその実装を分離することがsbtの優れたスタイルであると考えてください。典型的なタスクの実装は単に引数をマーシャリングし、実際にその作業を行うメソッドを呼び出します。そのようにして呼び出すタスクが実装されている場合、「タスクTを呼び出すにはどうすればよいですか?」という答えが返されます。 "しないでください:同じコードTを呼び出して呼び出します。"

具体的な答え:あなたが実際に解決しようとしている問題があるよう

しかし、あなたの例から、それは私には見えます「どのように私は実行に加えて、カスタムの実行タスクを作成することができますか?」この質問はsbt FAQで回答されています。 http://www.scala-sbt.org/0.13.0/docs/faq.htmlを参照してください。答えは、便利なメソッドfullRunTaskfullRunInputTaskを使用することです。

これらのメソッドのソースコードを見ると、別のタスクを呼び出すタスクを作成しないことがわかります。むしろ、彼らは "同じコードを呼び出す"アプローチを採用しています。

+0

これはまだ0.13.9に適用できますか?カスタムタスクの中で '(コンパイル時に.value'を実行する)を含まないのはなぜですか?私の場合は、どのような方法でも 'run'をオーバーライドすることなく、依存プロジェクトの' run'タスクを実行するカスタムタスクしか必要としません。 – matanster

+0

'run'の振る舞いについて何か変更する必要がない場合、それはうまく聞こえます。 (私は私の答えの最初の部分でそう言ったと思う。) –

+0

私の場合は何も起こらない。 '(SubProjectでコンパイルする).value'は動作しますが、'(SubProjectでコンパイルで実行します).value'は動作しません。おそらくそこに '実行'のための特別なsomethings。たぶん私はそれのための新しい質問を開く必要があります。 – matanster

関連する問題