gradleプラグインを作ってみる (1)

2014-03-21T00:00:00+00:00 gradle groovy

gradleプラグイン開発な辺りを勉強してみた

gradleプラグインの構造について

├── build.gradle
└── src
    └── main
        ├── groovy
        │   └── kinjouj
        │       └── gradle
        │           └── plugin
        │               ├── HelloWorldPlugin.groovy
        │               └── HelloWorldTask.groovy
        └── resources
            └── META-INF
                └── gradle-plugins
                    └── helloworld.properties

的な感じでビルドしたあとのjarで

├─── META-INF
│   ├── MANIFEST.MF
│   └── gradle-plugins
│       └── helloworld.properties
└── kinjouj
    └── gradle
        └── plugin
            ├── HelloWorldPlugin.class
            └── HelloWorldTask.class

的な感じで作る。META-INF/gradle-plugins/プラグイン名.propertiesで定義したのがプラグインとして利用できるようになるっぽい。つまり上記の場合にはプラグイン名はhelloworldになる

まぁプラグインのソースを一つづつ書いていく

build.gradle (プラグイン側)

apply plugin: "groovy"
apply plugin: "maven"

group "kinjouj.gradle"

dependencies {
    compile localGroovy()
    compile gradleApi()
}

groovyとgradleなAPIの依存性が必要なのでlocalGroovyとgradleApiを利用する

src/main/resources/META-INF/gradle-plugins/helloworld.properties

implementation-class=kinjouj.gradle.plugin.HelloWorldPlugin

implementation-classにプラグインクラスを指定するだけ

src/main/groovy/kinjouj/gradle/plugin/HelloWorldPlugin.groovy

package kinjouj.gradle.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class HelloWorldPlugin implements Plugin<project> {
    @Override
    void apply(Project project) {
        HelloWorldTask task = (HelloWorldTask)project.task(
            "hello",
            type: HelloWorldTask
        )
    }
}

helloタスクを動かす際にHelloWorldTaskクラスを利用するようにする等

src/main/groovy/kinjouj/gradle/plugin/HelloWorldTask.groovy

package kinjouj.gradle.plugin

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

class HelloWorldTask extends DefaultTask {

    private String message = "hello world"

    void setMessage(String message) {
        this.message = message
    }

    @TaskAction
    void runTask() {
        println message
    }
}

DefaultTaskを継承しつつ、@TaskActionアノテーションを付与したメソッドが動作する模様。で.gradleファイル上でタスクを動かすにあたってパラメーターとかを利用する場合には、セッターメソッドを定義しとけば良いっぽい

んまぁここまでがプラグインのソース辺りなのでビルドしてinstallしておけば使えるようになる

build.gradle

buildscript {
    repositories {
        mavenLocal()
    }

    dependencies {
        classpath "kinjouj.gradle:helloworld-plugin:+"
    }
}

apply plugin: "helloworld"

hello {
    message "hoge"
}

な感じで使う。でgradle tasksをすると

:tasks

Other tasks
-----------
hello

な感じでhelloタスクが使えるようになる。で上記のbuild.gradle上でhelloタスクのmessageパラメーターを設定しているのでそれが利用される

んまぁgradleのプラグイン開発の初歩辺りはこんなもんで

angular.jsをやってみる (10) - ngCookies - angular.jsをやってみる (9) - $resourceのparamsDefaultにおける@接頭辞 -