---
title: Gradle Build Scriptの第0歩: 仕組みから書き方を理解する
tags: 
author: [Udomomo](https://www.docswell.com/user/Udomomo)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/9E21QPXDJR.jpg?width=480
description: エンジニア達の「完全に理解した」Talk #72 での発表資料です
published: December 23, 25
canonical: https://www.docswell.com/s/Udomomo/ZDWRW6-2025-12-23-201201
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/9E21QPXDJR.jpg)

Gradle Build Scriptの第0歩:
仕組みから書き方を理解する
どもも (@Udomomo)
2025-12-23 エンジニア達の「完全に理解した」Talk #72


# Page. 2

![Page Image](https://bcdn.docswell.com/page/D7YZW58MJM.jpg)

プロフィール
• どもも (@Udomomo)
• バックエンドエンジニア
• 普段使いの言語はKotlin
• アカウントIDの可読性が低いのが悩み


# Page. 3

![Page Image](https://bcdn.docswell.com/page/VEN39NQ3E8.jpg)

今日のテーマ「Gradle」


# Page. 4

![Page Image](https://bcdn.docswell.com/page/Y7992RDP73.jpg)

こんなことありませんか？
• ビルドの設定ファイルで何をやっているかわからない
• 正直言って他の設定ファイルからコピペしてる
• 書き方を調べても、何がどうなっているかのイメージが全然わかない…
→ 個々の文法以前に、Build Scriptまわりのエコシステムについてざっくりとイ
メージできることが重要


# Page. 5

![Page Image](https://bcdn.docswell.com/page/G7895W3XJD.jpg)

今日の目的
• Gradle Build Scriptの設定記述~実行までの仕組みについて、脳内に大まかな
イメージができること
※ Gradleの基礎知識やコマンドの実行方法には立ち入りません
※ 普段使いがKotlinなのでKotlinを前提にしています


# Page. 6

![Page Image](https://bcdn.docswell.com/page/L7LWYNVNER.jpg)

Gradleで最初に悩んだこと
plugins {
kotlin(&quot;jvm&quot;) version &quot;2.2.21&quot;
kotlin(&quot;plugin.spring&quot;) version &quot;2.2.21&quot;
id(&quot;org.springframework.boot&quot;) version &quot;4.0.1&quot;
id(&quot;io.spring.dependency-management&quot;) version &quot;1.1.7&quot;
}
group = &quot;com.example&quot;
version = &quot;0.0.1-SNAPSHOT&quot;
description = &quot;Demo project for Spring Boot&quot;
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation(&quot;org.springframework.boot:spring-boot-starter&quot;)
implementation(&quot;org.jetbrains.kotlin:kotlin-reflect&quot;)
testImplementation(&quot;org.springframework.boot:spring-boot-starter-test&quot;)
testImplementation(&quot;org.jetbrains.kotlin:kotlin-test-junit5&quot;)
testRuntimeOnly(&quot;org.junit.platform:junit-platform-launcher&quot;)
}
kotlin {
compilerOptions {
freeCompilerArgs.addAll(&quot;-Xjsr305=strict&quot;, &quot;-Xannotation-default-target=param-property&quot;)
}
}
tasks.withType&lt;Test&gt; {
useJUnitPlatform()
}


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4EM9NXGQ7W.jpg)

Gradleで最初に悩んだこと
この文法 なに？


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PERGDNZK79.jpg)

GradleのDSLとAPI


# Page. 9

![Page Image](https://bcdn.docswell.com/page/P7XX1N957X.jpg)

Gradle DSL
• DSLとは？
• Domain Speci c Language
• 特定のドメインにおける問題解決のために作成されたプログラミング言語
fi
• 汎用的なプログラミング言語の機能を使って、DSLを作ることもできる


# Page. 10

![Page Image](https://bcdn.docswell.com/page/37KW2NPR7D.jpg)

Gradle DSL
• Gradle DSLとは？
• Gradleを操作するためのDSLで、Groovy DSLとKotlin DSLが存在する
• build.gradle.ktsの内容はValidなKotlinコード
• GradleがDSL向けに用意している型のリファレンス
https://docs.gradle.org/current/dsl/index.html
• Kotlin公式によるDSLの書き方ガイド
https://kotlinlang.org/docs/type-safe-builders.html


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LJ314VXGE5.jpg)

Gradle API
• Gradleのコアとして用意されているAPI
• Gradleを操作するために必要なメソッドやクラスなど
• Gradle APIのリファレンス
https://docs.gradle.org/current/javadoc/index.html


# Page. 12

![Page Image](https://bcdn.docswell.com/page/8JDXQ82N7G.jpg)

Gradle DSLとGradle APIの関係
Gradle Core
Gradle API
利用
DSL
記述
Build Script


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VEPPL81NE8.jpg)

Gradle DSLだけ覚えればいいのか？
• Gradle DSLがAPIを隠蔽することで、開発者は直感的にBuild Scriptを書く
ことができる
• とはいえ、DSLの文法の知識しかないと、複雑なTaskを書くときに詰まる
• Gradle APIの側で、Taskの設定は (だいたい) どのように行われているか？の
イメージを持つことが重要


# Page. 14

![Page Image](https://bcdn.docswell.com/page/27V2QNYY7Q.jpg)

Gradle Taskの設定の仕組み


# Page. 15

![Page Image](https://bcdn.docswell.com/page/5JGRWK9W7L.jpg)

Gradle APIのContainer Type
• Gradle APIには “Container Type” と呼ばれる型がいくつかある
• リソースの取得・作成・更新などは、対応するContainerのAPIを通じて行う


# Page. 16

![Page Image](https://bcdn.docswell.com/page/47QV3NWQEP.jpg)

例: TaskContainer
tasks.withType&lt;Test&gt; {
useJUnitPlatform()
}
• TaskContainerを通じて、そのprojectのTaskのうちTest型を継承する
ものを取得
• テスト実行時にJUnit5を使えるように設定を追加


# Page. 17

![Page Image](https://bcdn.docswell.com/page/KE4M1GKY71.jpg)

Projectも型である
• Projectはbuild.gradle.ktsと1対1
の関係で作られる
• ProjectのAPIを使うことで、
Project全体の設定の取得・操作が
可能
fi
• tasksやdependenciesなどは、
projectに生えているAPIである
Project
tasks
dependencies
con gurations
…


# Page. 18

![Page Image](https://bcdn.docswell.com/page/L718GDXNJG.jpg)

Pluginが行っていること
ktlint {
verbose.set(true)
filter {
exclude(&quot;**/build/**&quot;)
}
}
• PluginはProjectのAPIを拡張している
• 例: KtlintのPluginは、ProjectにktlintというAPIを追加し、独自のTaskやプ
ロパティを設定可能にしている


# Page. 19

![Page Image](https://bcdn.docswell.com/page/G7WZKYKM72.jpg)

TaskとTaskの関係性


# Page. 20

![Page Image](https://bcdn.docswell.com/page/4JZ1ZXZME3.jpg)

Gradleの実行ステップ
( https://docs.gradle.org/current/userguide/build̲lifecycle.html )


# Page. 21

![Page Image](https://bcdn.docswell.com/page/YE6LZ4Z57V.jpg)

Task Graph
• GradleはBuild Scriptの内容を確認し、タスクの依存関係のグラフを作る
• Task単体の設定だけでなく、Task同士の関係性の設定もBuild Scriptの役割
のひとつ


# Page. 22

![Page Image](https://bcdn.docswell.com/page/GE51WQWGJ4.jpg)

例: Taskに依存関係を追加する
val ktlintCheck = tasks.named(&quot;ktlintCheck&quot;)
tasks.named(&quot;check&quot;) {
dependsOn(ktlintCheck)
}
• Ktlint pluginを導入すると、ktlintCheckというTaskが利用可能になる
• このtaskを取得し、check Taskから依存させる


# Page. 23

![Page Image](https://bcdn.docswell.com/page/9721QPQDER.jpg)

Task Graphを作るうえでの工夫
• tasks.namedで取得されるのはtaskの実体ではなく、taskを参照する
TaskProviderである
• checkタスク以外を実行するときは、ktlintCheckやcheckをTask Objectと
して作らずに済むので、パフォーマンスが向上する
• このような機能のあるAPIは Con guration Avoidance API と呼ばれ、利用
fi
fi
が推奨されている
( https://docs.gradle.org/current/userguide/
task̲con guration̲avoidance.html )


# Page. 24

![Page Image](https://bcdn.docswell.com/page/DJYZW5WMEM.jpg)

他にも様々な機能がある
• Task GraphをキャッシュするCon guration Cache
• ビルドの途中成果物をキャッシュして使い回すBuild Cache など…
• ビルドはコードの追加・変更のたびに頻繁に行うもの。Gradleは正確なTask
fi
Graphの構築とパフォーマンス向上との両立を目指している。


# Page. 25

![Page Image](https://bcdn.docswell.com/page/V7N39N9378.jpg)

今日のまとめ
• Gradleの設定は、DSLで隠蔽されたGradle APIを叩き、Gradle Coreをどう
操作するかを定義したものである
• GradleはTask Graphの構築と最適化を担っており、そのために多くの機能が
存在する
• 設定の際は、Task間の依存関係やパフォーマンスの観点を意識するとよい


