2016-04-02 10 views
2

gradleでタスクの要素を抽象化するための、すっきりした簡単な方法はありますか?DRY Gradle Tasks

私は、JavascriptにコンパイルするいくつかのScalaを含む混合プロジェクトを作成しています。これは、Gradleだけでは可能ではないようです。しかし、私はこのようになり、いくつかのタスクで終わる:

task buildScalaJS(type: Exec) { 
    workingDir './scalajs' 
    commandLine '../sbt', 'fastOptJS' 
} 

task buildScalaJSLauncher(type: Exec, dependsOn: buildScalaJS) { 
    workingDir './scalajs' 
    commandLine '../sbt', 'scalaJSLauncher' 
} 

私の最初の考えは次のように関数にこの抽象にした:しかし、これらのプロパティは、の範囲外では存在しません

def sbt(String... params) { 
    workingDir './scalajs' 
    commandLine('../sbt', params) 
} 

タスクの定義は、この(わかりやすく)エラーになります。

def sbtTask(String taskName, String sbtTask = taskName, Map options) { 
    Map defaultOptions = [type: Exec] 
    task ("${taskName}", (defaultOptions << options)) { 
     workingDir './scalajs' 
     commandLine '../sbt', sbtTask 
    } 
} 

sbtTask('buildScalaJS', 'fastOptJS') 
sbtTask('buildScalaJSLauncher', 'scalaJSLauncher', dependsOn: 'buildScalaJS') 

しかし、Gradleのメソッド「sbtTaskは()」が見つかりませんでしたと文句を言います:私は想像することができます


唯一の他の方法は、タスクを生成する関数を持つことです。


誰でもこれを行う方法を提案できますか?

あなたが sbt()に引数としてタスクを追加した場合、あなたの最初のオプションが動作するはず

答えて

3

def sbt(task, String ... params) { 
    task.workingDir './scalajs' 
    task.commandLine('../sbt', params) 
} 

task buildScalaJS(type: Exec) { 
    sbt delegate, 'fastOptJS' 
} 

task buildScalaJSLauncher(type: Exec, dependsOn: buildScalaJS) { 
    sbt delegate, 'scalaJSLauncher' 
} 

EDITを:私は、引数として渡されますので、あなたはおそらく、コマンドライン方式の問題点を取得することになりまし参照(String、String [])。 task.commandLine(['../sbt'] + (params as List))

2つ目のオプションも機能するはずですが、関数定義とタスク定義に問題があります。これを次のように変更してみてください:

def sbtTask(Map options = [:], String taskName, String sbtTask) { 
    Map defaultOptions = [type: Exec] 
    task(defaultOptions + options, taskName) { 
     workingDir './scalajs' 
     commandLine '../sbt', sbtTask 
    } 
} 

sbtTask 'buildScalaJS', 'fastOptJS' 
sbtTask 'buildScalaJSLauncher', 'scalaJSLauncher', dependsOn: 'buildScalaJS' 
+0

また、私は 'delegate'を知っています。 2番目の解決策の主な問題は、関数への引数の順序であるように見えます。私はそれを少しでも楽しんだ。オプションの存在が他のデフォルト値を排除すると思うのは正しいですか?オプションマップは最初の引数でなければなりませんか? –

+1

私は当初、オプションマップでも他のデフォルトを持つことができると思っていましたが、試してみるとうまく動作しませんでした。そして、オプションマップが最初の引数であれば、引数リストのどこにでもマップエントリを置くことができます。 – Steinar

+0

+1 ... 'delegate'は、私のgradleファイルに繰り返し定義されたタスクの量が増えているのを救ってくれました。 – risteli