banner
jzman

jzman

Coding、思考、自觉。
github

GradleシリーズのGradleプラグイン

前面几篇学習した Gradle 構築タスクの基礎知識、Project と Task という 2 つの概念を理解しました。最初に前の数記事を読むことをお勧めします:

Gradle には多くの一般的なプラグインが組み込まれており、Gradle のプラグインは特定のシーンで私たちの開発効率を向上させるのに役立ちます。既存のプラグインを拡張することで、さらに多くの機能を実現できます。たとえば、Android Gradle プラグインは、組み込みの Java プラグインに基づいて実装されています。

  1. プラグインの役割
  2. プラグインの適用方法
  3. カスタムプラグイン

プラグインの役割#

まず、Gradle プラグインの役割について説明します。主に以下のいくつかの側面があります:

  1. プロジェクトにタスクを追加し、プロジェクトをテスト、コンパイル、パッケージ化できます。
  2. プロジェクトに依存関係を追加し、プロジェクト構築中に必要な依存関係を設定できます。
  3. プロジェクトの既存のオブジェクトタイプに新しい拡張プロパティやメソッドを追加でき、プロジェクトの設定や構築の最適化が容易になります。たとえば、Android プロジェクト構築の android {} は、Android Gradle プラグインが Project オブジェクトに追加した拡張です。
  4. プロジェクトにいくつかの規約を適用できます。たとえば、Java Gradle プラグインを使用すると、src/main/java ディレクトリにソースコードを配置する場所を規約として設定でき、コンパイル時に指定されたディレクトリ内の Java ソースコードファイルをコンパイルできます。

プラグインの適用方法#

プラグインを使用する前に、Project の apply メソッドを使用してそのプラグインを適用する必要があります。プラグインはバイナリプラグインとスクリプトプラグインに分かれています。

バイナリプラグインの使用#

バイナリプラグインは org.gradle.api.Plugin インターフェースを実装したプラグインで、各 Java Gradle プラグインには plugin id があります。次のようにして Java プラグインを使用できます:

apply plugin : 'java'

上記のコードにより、Java プラグインが私たちのプロジェクトに適用されました。ここで java は Java プラグインの plugin id です。Gradle に付属するコアプラグインにはすべて一意の plugin id があり、ここでの java に対応する具体的なタイプは org.gradle.api.plugins.JavaPlugin です。したがって、次のようにして Java プラグインを使用できます:

apply.plugin:org.gradle.api.plugins.JavaPlugin
//org.gradle.api.pluginsはデフォルトでインポートされます
apply.plugin:JavaPlugin

バイナリプラグインは一般的に Jar にパッケージ化されて公開されます。カスタムプラグインを作成する際には、プラグインの Plugin id を指定する必要があります。この plugin id は一意でなければならず、アプリケーションパッケージ名を使用して plugin id の一意性を保証できます。

スクリプトプラグインの使用#

スクリプトプラグインの使用は、実際には特定のスクリプトファイルの使用です。スクリプトプラグインを使用する際には、スクリプトを読み込むだけで済みます。スクリプトプラグインを使用するには、キーワード from を使用する必要があります。後ろのスクリプトファイルはローカルのものでもネットワーク上のものでもかまいません。以下にスクリプトを定義し、build.gradle ファイルで使用します。具体的には次のようになります:

//version.gradleファイル
ext{
    versionName = "1.0"
    versionCode = 1
}

次に、このスクリプトファイルを構築ファイルで使用します。具体的には次のようになります:

//build.gradleファイル
apply from: 'version.gradle'

task taskVersion{
    doLast{
        println "バージョンは${versionName},バージョン番号は${versionCode}"
    }
}

上記のコードの実行結果は次のとおりです:

PS E:\Gradle\study\GradlePlugin> gradle taskVersion

> Task :taskVersion
バージョンは1.0,バージョン番号は1


BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

明らかに、apply from によってプラグインスクリプトが参照されました。スクリプトプラグインの使用により、構築に使用されるスクリプトファイルを段階的に整理できます。スクリプトファイルを責任の明確な単一のスクリプトファイルに分離し、apply from キーワードを使用してこれらのスクリプトファイルを直接使用できます。たとえば、特定のツール性質のメソッドや各依存関係のバージョン番号をそれぞれ単一の gradle ファイルに定義し、各依存関係のバージョン番号を統一して呼び出し、管理するのが便利です。

apply メソッドの用法#

Project.apply () は 3 種類の異なる引数を受け取ることができます。具体的には次のようになります:

//クロージャを引数として
void apply(Closure closure);
//ObjectConfigurationActionを設定
void apply(Action<? super ObjectConfigurationAction> action);
//Mapを引数として
void apply(Map<String, ?> options);

上記の 3 つの方法を使用してプラグインを設定できます。3 つの方法の書き方は次のようになります:

//Mapを引数として
apply plugin:'java'
//クロージャを引数として
apply{
    plugin 'java'
}
//ObjectConfigurationActionを設定
apply(new Action<ObjectConfigurationAction>() {

    @Override
    void execute(ObjectConfigurationAction objectConfigurationAction) {
        objectConfigurationAction.plugin('java')
    }
})

サードパーティが公開したプラグインの使用#

多くの場合、プロジェクトを構築するためにサードパーティのプラグインが必要です。使用する際には、buildscript {} 内で classpath を設定する必要があります。たとえば、Android Gradle プラグインを使用する際には、build.gradle {} 内で対応する classpath を設定する必要があります。コードは次のようになります:

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
    }
}

buildscript {} ブロックは、プロジェクト構築の前にプロジェクト構築に関連する依存関係を設定するためのものです。これらの依存関係を設定した後、次のようにしてプラグインを使用できます:

//使用する際には必ずbuildscript{}内で相応のclasspathを設定する必要があります
apply plugin: 'com.android.application'

plugins DSL を使用してプラグインを適用する#

plugins DSL は新しいプラグインの適用方法で、この方法は Gradle 2.1 以上でのみ使用できます。使用方法は次のようになります:

//plugins DSL 方法
plugins{
    id 'java'
}
//サードパーティのプラグインが https://plugins.gradle.org/ にホストされている場合、
//buildscript に classpath を設定する必要はありません
plugins{
    id "プラグインid" version 'プラグインバージョン番号'
}

プラグインの使用についてはここまでです。

カスタムプラグイン#

多くの場合、プロジェクトの構築操作を完了するためにカスタムプラグインが必要です。カスタムプラグインは Plugin インターフェースを実装する必要があり、インターフェース内の apply メソッドはプラグインが適用されるときに実行されます。このメソッド内で関連する操作を実行できます。以下に Android Studio を使用して簡単なプラグインの開発を行います。このプラグインの役割はタスクを作成することです。ここでは主に Android Studio を利用して Groovy プロジェクトを作成し、関連するコードの開発を行います。

Android Studio でモジュールを作成し、src/main、build.gradle 以外の他のファイルを削除します。その後、.groovy ファイルを作成して Plugin インターフェースを実装します。ファイルの内容は次のとおりです:

package com.manu.plugin

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

/**
 * カスタムプラグイン
 */
class MPlugin implements Plugin<Project>{

    @Override
    void apply(Project target) {
        target.task('taskPlugin')  {
            doLast {
                println "カスタムプラグインがタスクを作成しました"
            }
        }
    }
}

次に、このプラグインの plugin id を指定し、src/main の下に resources/META-INF/gradle-plugins ディレクトリを作成します。そして、plugin id を持つプロパティファイルを作成します。ファイルの内容は次のとおりです:

//プラグインの具体的な実装クラスを指定
implementation-class=com.manu.plugin.MPlugin

次に、build.gradle ファイルの対応する設定を以下のように参考にします:

apply plugin: 'groovy'

dependencies {
    //gradle sdk
    compile gradleApi()
    //groovy sdk
    compile localGroovy()
}

これで簡単なプラグインが定義されました。実用的にするために、このプラグインプロジェクトを jar パッケージとして生成し、他のプロジェクトで使用できるようにします。以下にカスタムプラグインプロジェクトのディレクトリのスクリーンショットを示します:

image

最後に、プロジェクトの構築でこのプラグインを使用します。プラグインを特定のプロジェクトにコピーします。たとえば、プロジェクトの libs フォルダにコピーし、プラグインの classpath を指定し、apply メソッドを使用してプラグインを使用します:

apply plugin: 'com.manu.plugin'

buildscript{
    dependencies{
        classpath files('libs/plugin.jar')
    }
}

上記のコードの実行結果は次のとおりです:

PS E:\Gradle\study\GradlePlugin> gradle taskPlugin

> Task :taskPlugin
カスタムプラグインがタスクを作成しました


BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

プラグインがタスク taskPlugin を作成したため、このタスクを使用できます。プラグインの基本的な使用は以上の通りです。次に、Java Gradle プラグインの使用を引き続き学習します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。