Gradle:既存タスクのパラメータを自由に変更する方法

Gradle:タスクをプログラム的に呼び出す方法は存在しないで書いたことだが、Gradleのおおよそのタスクについては、プログラム的にその実行を指示することができない。dependsOnを設定するしかない。

だから、別の何らかのタスクで簡略化したパラメータを受け取り、対象とするタスクの元々のパラメータ形式に変換して実行するといった方法が無いように思える。

しかし、少々の見づらさを我慢すれば可能になることがわかった。

完成形

とりあえずの完成形は以下だ。

defJarTask(name: 'makeJar', dependsOn:['classes']) {
  jar = 'test/test.jar'
  source sourceSets.main.output, ....
}

これは、以下の定義と同じになる。パラメータの名前や指定方法を変更している。

task makeJar(type: Jar, dependsOn: ['classes']) {
  destinationDir = file('test')
  archiveName = 'test.jar'
  from sourceSets.main.output
  from ....
  from ....
}

方法

以下の定義でいける

class JarSpec {
  String jar;  
  List froms = new ArrayList()
  def source(Object...o) {
    froms.addAll(o);
  }
}

def defJarTask = { args, closure -> 
  String name = args.remove('name')
  Object dependsOn = args.remove('dependsOn')
  if (args.size() > 0) 
    throw new RuntimeException("Unknown args:" + args);

  JarSpec jarSpec = new JarSpec()
  closure.delegate = jarSpec
  closure()
  tasks.create(name: name, type: Jar, dependsOn: dependsOn) {
     jarSpec.froms.each {
       from it
     }
     int lastSlash = jarSpec.jar.lastIndexOf('/')
     if (lastSlash < 0) {
       archiveName = jarSpec.jar
       return;
     }
     destinationDir = file(jarSpec.jar.substring(0, lastSlash))
     archiveName = jarSpec.jar.substring(lastSlash + 1)
  }
}