gradleで既存タスクの共通処理を定義する

2018年7月13日

gradleでの既存タスクの共通処理を定義する方法。ここでとりあげる例はごく簡単なものだが、ときには何十行にも及ぶ場合があり、それをそのままコピーするのではなく、共通部分はまとめて定義できないものかという話。

ごく簡単な例としてCopyタスクをあげる。

方法1

task copy1(type: Copy) {
  from 'some.config'  
  into 'tmp/1'
}

これはなんの変哲も無いものだが、仮にこのfrom部分が長大なものとして、コピー先だけをあちこに変更したタスクを作りたいとすると、

task copy1(type: Copy) {
  into 'tmp/1'
}
task copy2(type: Copy) {
  into 'tmp/2'
}
tasks.withType(Copy) {
  from 'some.config'        
}

しかしこれでは、すべてのCopyタスクがこうなってしまう。

方法2

別の方法としては以下。Copyとは異なるクラスを作成し、それを初期化する。

task copy1(type: MyCopy) {
  into 'tmp/1'
}
task copy2(type: MyCopy) {
  into 'tmp/2'
}
class MyCopy extends Copy {
  public MyCopy() {
    from 'alone.config'  
  }
}

ただし、タスクによっては方法2が効かない場合がある。理由は今のところ不明。