カスタムGradleプラグインを書く

カスタムGradleプラグインの作成

1. 前書き

Gradleは非常に人気のあるビルドツールであり、高度にカスタマイズ可能なビルドプロセスで高く評価されています。

今日は、カスタムGradleプラグインを作成する方法を紹介します。これにより、標準構成で達成できる以上にビルドプロセスを変更できます。

2. プラグインのソースの場所

コードをいくつかの異なる場所に配置できます。 それらのすべてには、いくつかの利点と欠点があります。

2.1. 構築スクリプト

プラグインのソースコードをビルドスクリプト自体に入れるだけです。 これにより、プラグインの自動コンパイルと組み込みが可能になります。

It’s very simple, however, our plugin won’t be visible outside of the build script.そのため、他のビルドスクリプトで再利用することはできません。

2.2. BuildSrcフォルダ

使用できるもう1つの可能性は、プラグインのソースコードをbuildSrc/src/main/javaフォルダーに配置することです。

Gradleを実行すると、buildSrcフォルダーの存在が確認されます。 存在する場合、Gradleはプラグインを自動的にビルドして組み込みます。

これにより、さまざまなビルドスクリプト間でプラグインを共有できるようになりますが、それでも他のプロジェクトで使用することはできません。

2.3. スタンドアロンプ​​ロジェクト

最後に、プラグインをさまざまなプロジェクトで完全に再利用可能にする別のプロジェクトとしてプラグインを作成できます。

ただし、外部プロジェクトで使用するには、jarファイルにバンドルしてプロジェクトに追加する必要があります。

3. 私たちの最初のプラグイン

基本から始めましょう–every Gradle Plugin must implement the com.gradle.api.Plugin interface.

インターフェースは汎用なので、さまざまなパラメータータイプでパラメーター化できます。 通常、パラメータタイプはorg.gradle.api.Project.です。

ただし、異なるライフタイムフェーズでプラグインが適用されるように、異なるタイプのパラメーターを使用できます。

  • org.gradle.api.Settingsを使用すると、プラグインが設定スクリプトに適用されます

  • org.gradle.api.Gradleを使用すると、プラグインが初期化スクリプトに適用されます

作成できる最も単純なプラグインは、hello worldアプリケーションです。

public class GreetingPlugin implements Plugin {
    @Override
    public void apply(Project project) {
        project.task("hello")
          .doLast(task -> System.out.println("Hello Gradle!"));
    }
}

ビルドスクリプト内に行を追加することで、これを適用できます。

apply plugin: GreetingPlugin

これで、gradle hello,を呼び出した後、ログに“Hello Gradle”メッセージが表示されます。

4. プラグイン構成

ほとんどのプラグインは、ビルドスクリプトから外部設定にアクセスする必要があります。

extension objectsを使用してこれを行うことができます。

public class GreetingPluginExtension {
    private String greeter = "example";
    private String message = "Message from the plugin!"
    // standard getters and setters
}

プラグインクラスに新しいextension objectを追加しましょう。

@Override
public void apply(Project project) {
    GreetingPluginExtension extension = project.getExtensions()
      .create("greeting", GreetingPluginExtension.class);

    project.task("hello")
      .doLast(task -> {
          System.out.println(
            "Hello, " + extension.getGreeter());
          System.out.println(
            "I have a message for You: " + extension.getMessage());
      });
}

これで、gradle hello,を呼び出すと、GreetingPluginExtension.で定義されたデフォルトのメッセージが表示されます。

しかし、拡張機能を作成したので、ビルドスクリプト内でクロージャを使用してそれを行うことができます。

greeting {
    greeter = "Stranger"
    message = "Message from the build script"
}

5. スタンドアロンプ​​ラグインプロジェクト

スタンドアロンのGradleプラグインを作成するには、もう少し作業が必要です。

5.1. セットアップ

まず、Gradle API依存関係をインポートする必要があります。これは非常に簡単です。

dependencies {
    compile gradleApi()
}

Mavenで同じことを行うには、Gradleリポジトリからのgradle-tooling-api依存関係が必要であることに注意してください。


    
        org.gradle
        gradle-tooling-api
        3.0
    
    
        org.gradle
        gradle-core
        3.0
        provided
    


    
        repo.gradle.org
        https://repo.gradle.org/gradle/libs-releases-local/
    

5.2. プラグインの配線

Gradleがスタンドアロンプ​​ラグインの実装を見つけられるようにするには、src/main/resources/META-INF/gradle_-plugins_にプロパティファイルを作成する必要があります。

リソースファイルには、プラグインIDと一致する名前が必要です。 So if our plugin has an id of org.example.greeting, the exact path of the file would be META-INF/gradle-plugins/org.example.greeting.properties.

次に、プラグインの実装クラスを定義できます。

    implementation-class=org.gradle.GreetingPlugin

implementation-classは、プラグインクラスの完全なパッケージ名と同じである必要があります。

5.3. プラグインIDの作成

Gradleでは、プラグインIDが従わなければならないいくつかの規則と規則があります。 それらのほとんどは、Javaのパッケージ名ルールに似ています。

  • 英数字、「。」および「-」のみを含めることができます

  • idには、ドメイン名とプラグイン名を区切る少なくとも1つの「。」が必要です。

  • 名前空間org.gradleおよびcom.gradlewareは制限されています

  • IDは「。」で開始または終了できません。

  • 2つ以上の連続した「。」文字は使用できません

最後に、プラグインIDは、逆ドメイン名の規則に従う小文字の名前にする必要があるという規則があります。

Javaパッケージ名とGradleプラグイン名の主な違いは、通常、パッケージ名がプラグインIDよりも詳細であることです。

5.4. 公開プラグイン

外部プロジェクトでプラグインを再利用できるようにプラグインを公開する場合、2つの方法があります。

まず、we can publish our plugin JAR to an external repository like Maven or Ivy.

または、Gradleプラグインポータルを使用できます。 これにより、幅広いGradleコミュニティからプラグインにアクセスできるようになります。 Gradleリポジトリへのプロジェクトの公開の詳細については、Gradle Plugin Portal Documentation.を参照してください。

5.5. JavaGradle開発プラグイン

Javaでプラグインを作成する場合、Java Gradle Development Plugin.の恩恵を受けることができます。

これにより、gradleApi()の依存関係が自動的にコンパイルおよび追加されます。 また、gradle jarタスクの一部としてプラグインメタデータの検証も実行します。

ビルドスクリプトに次のブロックを追加して、プラグインを追加できます。

plugins {
    id 'java-gradle-plugin'
}

6. プラグインのテスト

プラグインが正しく機能し、Project,に適切に適用されていることをテストするには、org.gradle.testfixtures.ProjectBuilderを使用してProjectのインスタンスを作成します。

次に、プラグインが適用され、適切なタスクがProjectインスタンスに存在するかどうかを確認できます。 これを行うには、標準のJUnitテストを使用できます。

@Test
public void greetingTest(){
    Project project = ProjectBuilder.builder().build();
    project.getPluginManager().apply("com.example.greeting");

    assertTrue(project.getPluginManager()
      .hasPlugin("com.example.greeting"));

    assertNotNull(project.getTasks().getByName("hello"));
}

7. 概要

この記事では、Gradleでカスタムプラグインを作成するための基本を説明しました。 プラグインの作成についてさらに詳しく知るには、Gradle Documentationを見てください。

そして、いつものように、すべてのコードサンプルはover on Githubで見つけることができます。