Gradleタスク上でGroovyコードを実行する。

Gradleタスクで、Groovyコードを指定して動かしてみよう。

Groovyスクリプトを外部から指定して実行することができるので、いろいろ便利になります。

Gradle内蔵のGroovyを利用できるので、Groovyを別途インストールしなくても動作します。

build.gradle の書き方

configurations {
 groovyScript
}

dependencies {
 groovyScript localGroovy()
}

task groovyRun(type: JavaExec) {
  classpath configurations.groovyScript
  main = 'groovy.ui.GroovyMain'

  doFirst {
      if (!project.hasProperty("e")) {
          throw new IllegalArgumentException("""
              |usage:
              |
              |./gradlew $name -Pe='
              |println "hello"
              |'
              |""".stripMargin())
      }

      systemProperties = System.properties
      args '-e', project.e
  }
}

configurations

configurations で、groovyScritpというのを定義します。
configurationは、Gradleの依存関係を表現するために定義される名前です。

javaプラグインを適用している時は、自動で compile, runtime などが定義されています。

./gradlew dependencies をすると出てくる項目が、configurationとなります。

./gradlew dependencies を叩いたときの出力例

$ ./gradlew dependencies
> Task :dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

annotationProcessor - Annotation processors and their dependencies for source set 'main'.
No dependencies

apiElements - API elements for main. (n)
No dependencies

archives - Configuration for archive artifacts.
No dependencies

compile - Dependencies for source set 'main' (deprecated, use 'implementation ' instead).

ここでは新しく、groovyScritpというものを定義しました。 (名称は何でもOKです。)

dependencies

Gradleは、内部でGroovyを利用しているため、
localGroovy() というのを使えばGradle内蔵のGroovyを使うことができます。

先程、定義したConfigurationの、groovyScriptは、Gradle内蔵のGroovyに依存すると定義しています。

classpath

タスクとして実行する際に、type: JavaExec として設定しています。

classpath には、依存するconfigurationを設定できますので、
追加で、mainのソースに依存させることも可能です。

classpath configurations.groovyScript, sourceSets.main.runtimeClasspath

実行してみよう。

こんな感じで 指定のgroovyコードを実行させることができます。

./gradlew -q groovyRun -Pe='

// ここにGroovyコードを指定できる。
println "hello"

'

このような書き方ができると、build.gradleはそのままで、
シェルスクリプトにしていろいろ手軽にGroovyコードが実行できるようになりますよね。

おしまい

src/main/groovy 配下にGroovyコード書けばいいじゃんと思いますが、
groovyRunタスクを一つ用意しておくだけで、わざわざ新たにタスクを用意しなくても、
簡素な処理であれば、シェルスクリプトにGroovyコードを書いて実行する事ができるので、柔軟かつ手軽で良いかと思います。

コメントを残す