Gradle Pluginのローカルmavenへのリリースおよびサンプルアプリからの使用方法

gradle pluginを開発するときに「ローカルのmavenにpluginをアップロード→サンプルアプリから利用してみる」をする方法。


[cookpad/LicenseToolsPlugin](https://github.com/cookpad/LicenseToolsPlugin)を手を加えたくてforkして試行錯誤した結果のメモです。なので出てくるコードはこちらからとってきたものですが大半です。ありがとうございます。:pray_tone1:

# 前提

- ディレクトリ構造

project root
|
|----plugin(plugin モジュール)
|
|----sample(サンプルアプリ モジュール) 

- plugin/build.gradle

```gradle
plugins {
    id 'org.jetbrains.kotlin.jvm'
    id "org.jlleitschuh.gradle.ktlint" version "10.1.0"
    id 'java-gradle-plugin'
    id 'com.gradle.plugin-publish' version '0.15.0'
}
apply plugin: "org.jlleitschuh.gradle.ktlint"
apply plugin: 'kotlin-kapt'

pluginBundle {
    website = 'https://github.com/cookpad/LicenseToolsPlugin'
    vcsUrl = 'https://github.com/cookpad/LicenseToolsPlugin.git'
    tags = ['android', 'license']
}

gradlePlugin {
    plugins {
        licenseToolsPlugin {
            id = 'com.cookpad.android.plugin.license-tools'
            displayName = 'LicenseToolsPlugin'
            description = 'Gradle plugin to check library licenses and generate license pages.'
            implementationClass = 'com.cookpad.android.plugin.license.LicenseToolsPlugin'
        }
    }
}

apply plugin: 'maven'

archivesBaseName = 'license-tools'
group = 'com.cookpad.android.plugin'
version = '1.2.8'

dependencies {
(略)
}
```

- sample/build.gradle

```gradle
// Tips: Apply license-tools from mavenLocal for debugging
//
//buildscript {
//    repositories {
//        google()
//        mavenCentral()
//        mavenLocal()
//    }
//    dependencies {
//        classpath 'com.cookpad.android.plugin:license-tools:$your_version'
//    }
//}
//apply plugin: 'com.cookpad.android.plugin.license-tools'

plugins {
    id "com.cookpad.android.plugin.license-tools" version "1.2.8"
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

android {
    compileSdkVersion 30
    buildToolsVersion "29.0.3"
    defaultConfig {
        applicationId "com.cookpad.android.license_tools_plugin"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildFeatures {
        viewBinding true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    // For Kotlin projects
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

licenseTools {
    ignoredGroups = [
            'com.foo.bar.android', //e.g. In-house library here.
    ]
    ignoredProjects = [
            'plugin',
    ]
}

dependencies {
(略)
}

```


# 手順



## plugin生成物を作成してローカルのmavenにアップロードする


1.plugin/build.gradleにMaven Publish Pluginを追加
```plugin/build.gralde
plugins {
    id 'org.jetbrains.kotlin.jvm'
    id "org.jlleitschuh.gradle.ktlint" version "10.1.0"
    id 'java-gradle-plugin'
    id 'com.gradle.plugin-publish' version '0.15.0'
    // -------以下追加-----
    id 'maven-publish'
    // -------追加終わり-----
}

(以降略)
```
2.plugin/build.gradleにローカルMavenにアップロードしたとき用の設定を追加
元から外のmaven用の設定は`pluginBundle`やその他`archivesBaseName = 'license-tools'`などで設定してあるけど、ローカルにリリースする時にはこの設定は働かないみたい。
```plugin/build.gralde
plugins {
   (略)
}
apply plugin: "org.jlleitschuh.gradle.ktlint"
apply plugin: 'kotlin-kapt'

pluginBundle {
    (略)
}

gradlePlugin {
    (略)
}

// -----以下追加-------
publishing {
    publications {
        maven(MavenPublication) {
            artifactId = 'license-tools'
            groupId = 'com.cookpad.android.plugin'
            version = '1.2.9' // ローカルmavenにリリースしたいバージョン

            from components.java
        }
    }
}
// -----追加終わり-------

apply plugin: 'maven'

(以降略)
```

3.生成物を作成してローカルのmavenにアップロード
AndroidStudioのターミナルで
`gradlew publishMavenPublicationToMavenLocal`
とすると、PCの`C:\Users\(ユーザー名)\.m2\repository\`
以下に指定した名称(のディレクトリ)・バージョンでリリースされます。(Windows 10 の場合)
※何もしなくても`gradlew publishMavenPublicationToMavenLocal`コマンドで`C:\Users\(ユーザー名)`以下に自動的に`.m2`ディレクトリができてそこがローカルのmavenとなる。

## サンプルアプリからローカルのmavenにアップロードしたプラグインを使用する

1.sample/build.gradleの`buildscript`などを追加・不要部をコメントアウト
`cookpad/LicenseToolsPlugin`さまの場合は追加が必要なものは元からコメントアウトして書いておいてくれている。

```sample/build.gradle
// Tips: Apply license-tools from mavenLocal for debugging
//

// -----以下追加---------------------------------

buildscript {
    repositories {
        google()
        mavenCentral()
        mavenLocal()
    }
    dependencies {
        classpath 'com.cookpad.android.plugin:license-tools:$your_version' // $your_version : 「plugin生成物を作成してローカルのmavenにアップロードする」の手順2で設定したversion。今回なら1.2.9
    }
}
apply plugin: 'com.cookpad.android.plugin.license-tools'

// -----追加終わり---------------------------------


// -----以下コメントアウト開始---------------------------------

//plugins {
//    id "com.cookpad.android.plugin.license-tools" version "1.2.8"
//}

// -----コメントアウト追加終了---------------------------------

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

(以降略)

```

2.通常通りのタスク名でローカルにリリースしたバージョンのpluginを使用できる。
`gradlew checkLicenses`

## 注意
「plugin生成物を作成してローカルのmavenにアップロードする」の手順3までを完全に完了するまえにsample/build.gradleの方まで書き換えてしまうと「plugin生成物を作成してローカルのmavenにアップロードする」の手順3の時に失敗します。
それはsample/build.graldeに書かれたバージョンのpluginツールがどこにもないからです。(pluginをリリースするのにsampleモジュールの方は使用しないが、タスクを動かす前に先にすべてのビルドファイルが正常に構成されているかチェックが入るよう。)
必ず「plugin生成物を作成してローカルのmavenにアップロードする」の手順3まで行ってからsample/build.gradleの方に手を加えてください。


# 参考にしたものなど
https://github.com/cookpad/LicenseToolsPlugin
https://qiita.com/opengl-8080/items/fcf60ba5daf658f39951
https://docs.gradle.org/current/userguide/publishing_maven.html
http://mike-neck.github.io/blog/2013/06/19/publish-maven-artifact-with-sign-files-1/