2016-10-04 7 views
0

次のシナリオを参照してください。のGradle DEPENDSONと動的変数

def dynamic = "original value" 

task stuffThatHasToBeDoneBefore << { 
    doSomething(dynamic) 
} 

task b (dependsOn: stuffThatHasToBeDoneBefore) { 
    dynamic = "value of task b that never will be used by stuffThatHasToBeDoneBefore-task" 
} 

task c (dependsOn: stuffThatHasToBeDoneBefore) { 
    dynamic = "value of task c" 
} 

私は、コードの重複を減らすために、私のビルドの実行にstuffThatHasToBeDoneBeforeタスクを複数回使用します。

今のところ、タスクbを実行することはできません。また、stuffThatHasToBeDoneBeforeタスクは動的値(「stuffThatHasToBeDoneBeforeタスクでは使用されないタスクbの値」で事前に実行されます)動的変数の値は構成フェーズ(タスクcの値)でタスクcによって上書きされるためです。

私はこれを行うには見る唯一の方法は以下の通りです:

task b_alternative << { 
    dynamic = "value of task b that will be used in stuffThatHasToBeDoneBefore-task now" 
    tasks.stuffThatHasToBeDoneBefore.execute() 
} 

を残念ながら、これは単なる回避策であり、私はtasks.taskname.executeを使用することを推奨されていないことを複数のソースで読みます()

私はstuffThatHasToBeDoneBeforeタスクを動的な値で再利用できるようにコードを構造化する方法を教えていただけますか?

通常、タスクの代わりに単純なメソッドを使用し、動的値を引数として渡しますが、stuffThatHasToBeDoneBefore-taskはタスクとしてのみ使用可能なため、これは不可能です方法としてではありません。

答えて

1

問題を解決するには、custom taskを使用します。 カスタムタスクをZipTaskに拡張し、カスタムdynamicプロパティを定義し、それを使用するdoSometingメソッドを定義できます。その後、実行するタイミング(ジップの作成前または作成後)に応じて、doSomethingdoFirstまたはdoLastに追加します。

ビルドスクリプトがより表現になっていない:

// import MyCustomTask here 
task b (type: MyCustomTask) { 
    dynamic = "value for task b" 
} 
task a (type: MyCustomTask) { 
    dynamic = "value for task a" 
} 

dynamicは、もはやビルドスクリプト内の変数であること、それが今、あなたのカスタムタスクのプロパティです。

+0

それについては考えていませんでした - ありがとう! – SilverJan