My experience with the Gralde Kotlin DSL is fairly limited - all of one build script which is the subject of this article.
If you want to simply see how a sample script looks, I have a sample github repo with just that here - https://github.com/bijukunjummen/cf-show-env
Just to compare:
1. Consider the way different plugins are applied with gradle:
plugins {
id "com.github.pivotalservices.cf-app" version "1.0.9"
}
apply plugin: 'kotlin"
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply from: 'gradle/gatling.gradle'
An equivalent kotlin dsl is the following:
plugins {
id("com.github.pivotalservices.cf-app").version("1.0.9")
}
apply {
plugin("kotlin")
plugin("java")
plugin("org.springframework.boot")
from("gradle/gatling.gradle")
}
2. Adding project dependencies:
dependencies {
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-devtools')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.boot:spring-boot-starter-web')
compile('com.google.guava:guava:19.0')
compile("org.webjars:bootstrap:3.3.7")
compile("org.webjars:jquery:3.1.1")
compile("io.prometheus:simpleclient:${prometheus_client_version}")
compile("io.prometheus:simpleclient_spring_boot:${prometheus_client_version}")
compile('nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
an equivalent code using kotlin DSL:
dependencies {
val prometheus_client_version = "0.0.21"
compile("org.springframework.boot:spring-boot-starter-actuator")
compile("org.springframework.boot:spring-boot-devtools")
compile("org.springframework.boot:spring-boot-starter-thymeleaf")
compile("org.springframework.boot:spring-boot-starter-web")
compile("com.google.guava:guava:19.0")
compile("org.webjars:bootstrap:3.3.7")
compile("org.webjars:jquery:3.1.1")
compile("io.prometheus:simpleclient:${prometheus_client_version}")
compile("io.prometheus:simpleclient_spring_boot:${prometheus_client_version}")
compile("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
3. Configuring Plugins - I have a plugin which helps deploy applications to Cloud Foundry, and works off a configuration which looks like this, when expressed using normal gradle build:
cfConfig {
//CF Details
ccHost = "api.local.pcfdev.io"
ccUser = "admin"
ccPassword = "admin"
org = "pcfdev-org"
space = "pcfdev-space"
//App Details
name = "cf-show-env"
hostName = "cf-show-env"
filePath = "build/libs/cf-show-env-0.1.3-SNAPSHOT.jar"
path = ""
domain = "local.pcfdev.io"
instances = 2
memory = 1024
timeout = 180
//Env and services
buildpack = "https://github.com/cloudfoundry/java-buildpack.git"
environment = ["JAVA_OPTS": "-Djava.security.egd=file:/dev/./urandom", "SPRING_PROFILES_ACTIVE": "cloud"]
cfService {
name = "p-mysql"
plan = "512mb"
instanceName = "test-db"
}
cfUserProvidedService {
instanceName = "mydb1"
credentials = ["jdbcUri": "someuri1"]
}
}
this can now be configured in a typesafe way with full auto-completion support in IntelliJ the following way using Kotlin DSL:
configure< CfPluginExtension> {
//CF Details
ccHost = "api.local.pcfdev.io"
ccUser = "admin"
ccPassword = "admin"
org = "pcfdev-org"
space = "pcfdev-space"
//App Details
name = "cf-show-env"
hostName = "cf-show-env"
filePath = "build/libs/cf-show-env-1.0.0-M1.jar"
path = ""
domain = "local.pcfdev.io"
instances = 2
memory = 1024
timeout = 180
//Env and services
buildpack = "https://github.com/cloudfoundry/java-buildpack.git"
environment = mapOf(
"JAVA_OPTS" to "-Djava.security.egd=file:/dev/./urandom",
"SPRING_PROFILES_ACTIVE" to "cloud"
)
cfService(closureOf<CfService> {
name = "p-mysql"
plan = "512mb"
instanceName = "test-db"
})
cfUserProvidedService(closureOf<CfUserProvidedService> {
instanceName = "myups"
credentials = mapOf(
"user" to "someuser",
"uri" to "someuri"
)
})
}
4. And finally a straight task:
task "hello-world" {
doLast {
println("Hello World")
}
}
task showAppUrls(dependsOn: "cf-get-app-detail") << {
print "${project.cfConfig.applicationDetail}"
}
looks more or less the same in Kotlin DSL:
task("hello-world") {
doLast {
println("Hello World")
}
}
task("showAppUrls").dependsOn("cf-get-app-detail").doLast {
println(cfConfig);
}
I am excited about using Kotlin DSL to configure my gradle builds, there are a few quirks to keep in mind though - the Intellij support tends to be a little flaky, it took a few tries for the IDEA to start helping with the auto-completions, also I needed to google quite a bit and look at some of the sample projects in gradle kotlin dsl, all in all though this has an awesome potential.