🐅

5分でGradleの全体像を理解する

2021/11/27に公開

Gradleの役割

Gradleはプロジェクトのコンパイルや、ライブラリーのインストールなどを行います。

Gradleの構成要素

Project

Projectは基本的にはGradleがコンパイルする対象となるアプリケーションです。アプリケーションのデプロイスクリプトがProjectとして設定されることもあります。

Build Script

build.gradle に記述されているスクリプトです。build.gradle はプロジェクトのコンパイルなどを実行します。Build Script はTaskやDependency, Pluginなどの設定を記述します。

Task

Projectをビルドするためのコマンドなどです。コンパイルだけでなくDeploy、データベースのマイグレーション、Testなど様々なタスクが存在します。

Dependency

Projectが利用するライブラリです。

Plugin

Build Scriptが利用するライブラリです。Dependencyと違ってProjectのソースコードが利用するものではなく、コンパイルプロセスが利用するライブラリです。

Pluginでインポートしたコマンドを、Build Script内で参照して実行することができます。

◇記述例


plugins {
    jacoco
}

jacoco {
    toolVersion = "0.8.1"
}

jacoco はBuild Scriptでデフォルトで利用できるメソッドではなく、plugins ブロックで記述されたjacoco プラグインによってインポートされるものです。

Gradleのドキュメントを読んでも見当たらないメソッドや、エディタのコード補完が聞かないメソッドはpluginによって読み込まれた記述である可能性があります。

◇Pluginの指定には二個の構文があります。

// 推奨形式
plugins {
    jacoco
} 
// 非推奨形式
apply(plugin = "jacoco")

ここで詳細は記述しませんが、plugins{} の方が可読性などの理由から推奨されていますが、制約などもあります。

Repositories

PluginやDependencyが読み込まれるライブラリ提供元です。mervenCentral はメジャーなライブラリー提供元です。以下のような記述で設定します。

repositories {
    mavenCentral()
    jecenter() // jcenterは2022/2月で終了予定なので mavernCentralに移行を推奨
    maven {
       url = "...."  // 特定のURLのレポジトリで配布されているmaven形式のライブラリ
    }
}

ライブラリはリモートレポジトリだけでなく、ローカルレポジトリやキャッシュなどからも読み込まれます。

◇参考

Gradle's Two type of repository and cache.

Gradleに関係するファイル群

以下のようなディレクトリ構成があったとします。

.
├── build.gradle
├── clients
│   ├── build.gradle
│   └── src
│       └── main
│           ├── kotlin...
├── contracts
│   ├── build.gradle
│   └── src
│       ├── main
│       │   └── kotlin
│       └── test
│           └── kotlin
├── gradle.properties
├── gradlew
├── gradlew.bat
├── repositories.gradle
├── settings.gradle
└── workflows
    ├── build.gradle
    └── src
        ├── integrationTest
        │   └── kotlin
        │       └── com
        ├── main
        │   └── kotlin
        │       └── com
        └── test
            └── kotlin
                └── com

build.gradle

上のディレクトリ構成で、"contracts", "workflows", "clients"ディレクトリ内にはそれぞれbuild.gradle ファイルが存在しています。

Gradleでは複数のProject(subproject)を管理することができ、それぞれのProject と対応するビルド手順やライブラリーを定義するのがbuild.gradle です。

settings.gradle

Gradleは複数のプロジェクトをまとめて管理できます。全プロジェクトで共通する記述や、subprojectのディレクトリ指定を行います。

以下の記述では、"workflows", "contracts", "clients"のディレクトリがサブプロジェクトであることを指定しています。

include 'workflows'
include 'contracts'
include 'clients'

gradlew, gradlew.bat

gradle コマンドは、gradlew(mac osなど) gradlew.bat(windows) を経由して実行されます。gradlew はgradleコマンドを適切なバージョンで実行するためのラッパーです。

gradlew, gradlew.bat が自動的にproject毎のバージョン管理をおこなってくれます。

Gradleに関係する設定ファイル

kotlin DSLとGroovy

build script はGroovyかKotlinによって記述されます。

KotlinとGroovyの構文の簡単な違いを記述します。

// Groovy: 関数に()がない
url "http://...."
// Kotlin
url("http://....")

// Groovy: 名前引数は param: value 形式
apply plugin: "name of plugin" 
// kotlin 
apply(plugin = "name of plugin" )

// Groovy: プロパティーのセットと関数が同じ構文
version "1.1.0"
// Kotlin
val version = "1.1.0"f

Discussion