4. Build script
Not visible outside the build script
Can’t reuse the plugin outside the build script it’s defined in
Easy to add
Automatically compiled and included in the classpath
5. buildSrc project
Not visible outside the build
Can’t reuse the plugin outside the build it’s defined in
Has dedicated directory
Automatically compiled and included in the classpath
Visible to every build script used by the build
|____rootProjectDir
| |____buildSrc
| | |____src
| | | |____main
| | | | |____groovy
6. Standalone project
Can be used in multiple builds
Requires a separate project
Can be published and shared with others
Packaged JAR may include many plugins
Requires an ID (e.g. ‘java’, `com.android.application` etc)
13. GreeterPlugin
ENTER FILENAME/LANG
import org.gradle.api.Plugin
import org.gradle.api.Project
class GreeterPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println 'Hello World!'
}
} Represents an extension to
Gradle
This interface is the main API
you use to interact with Gradle
18. SayHelloTask
ENTER FILENAME/LANGimport org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class SayHelloTask extends DefaultTask {
@TaskAction
void sayHello() {
println 'Hello World!'
}
}
the standard Task
implementation. You can
extend this to implement
your own task types.
Marks a method as the
action to run when the task
is executed.
19. GreeterPlugin
ENTER FILENAME/LANG
import org.gradle.api.Plugin
import org.gradle.api.Project
class GreeterPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.tasks.create('sayHello', SayHelloTask) {
group 'greeter'
description 'Says hello'
}
}
}
20. GreeterPlugin
ENTER FILENAME/LANG
import org.gradle.api.Plugin
import org.gradle.api.Project
class GreeterPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.tasks.create('sayHello', SayHelloTask) {
group 'greeter'
description 'Says hello'
}
}
}
Create the Task of specific type
29. Create readable DSL!
ENTER FILENAME/LANG
apply plugin: GreeterPlugin
greeter {
speakers {
‘Dmytro Zaitsev’ {
city 'Kyiv'
company 'Lóhika'
}
‘Jake Wharton’ {
city 'San Francisco'
company 'Square'
}
‘Mateusz Herych’ {
city 'Kraków'
company 'IGcom'
}
}
}
build.gradle
NamedDomainObjectContainer
Domain objects
30. Speaker domain object
ENTER FILENAME/LANG
class Speaker {
String name
String city
String company
Speaker(String name) {
this.name = name
}
def city(String city) {
this.city = city
}
def company(String company) {
this.company = company
}
}
We need a name property
so the object can be created
by Gradle using a DSL.
37. Extension test
ENTER FILENAME/LANG
class GreeterPluginTest {
@Test
public void canAddGreeterExtension() {
Project project = ProjectBuilder.builder().build()
project.apply plugin: 'greeter'
assert project.greeter instanceof GreeterExtension
}
}
38. Extension test
ENTER FILENAME/LANG
class GreeterPluginTest {
@Test
public void canAddGreeterExtension() {
Project project = ProjectBuilder.builder().build()
project.apply plugin: 'greeter'
assert project.greeter instanceof GreeterExtension
}
}
Stub a Project
39. Extension test
ENTER FILENAME/LANG
class GreeterPluginTest {
@Test
public void canAddGreeterExtension() {
Project project = ProjectBuilder.builder().build()
project.apply plugin: 'greeter'
assert project.greeter instanceof GreeterExtension
}
}
Apply the plugin
40. Extension test
ENTER FILENAME/LANG
class GreeterPluginTest {
@Test
public void canAddGreeterExtension() {
Project project = ProjectBuilder.builder().build()
project.apply plugin: 'greeter'
assert project.greeter instanceof GreeterExtension
}
}
Check that extension exists
41. Task test
ENTER FILENAME/LANG
class GreeterPluginTest {
@Test
public void canAddSayHelloTask() {
Project project = ProjectBuilder.builder().build()
project.apply plugin: 'greeter'
assert project.tasks.sayHello instanceof SayHelloTask
}
}
42. Links
1) Official Gradle documentation:
https://docs.gradle.org/current/userguide/custom_plugins.html
2) Example of plugin written in Kotlin:
https://github.com/RxViper/RxViper/tree/1.x/rxviper-gradle-plugin
3) Books:
https://gradle.org/books/