Syntax improvements in Convention Plugins

pull/1504/head
javernaut 1 year ago
parent 85129e4660
commit f8197db250

@ -46,6 +46,9 @@ dependencies {
compileOnly(libs.ksp.gradlePlugin)
compileOnly(libs.room.gradlePlugin)
implementation(libs.truth)
// Accessing the Version Catalog in convention plugins according to
// https://github.com/gradle/gradle/issues/15383#issuecomment-779893192
implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
}
tasks {

@ -16,20 +16,22 @@
import com.android.build.api.dsl.ApplicationExtension
import com.google.samples.apps.nowinandroid.configureAndroidCompose
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.getByType
class AndroidApplicationComposeConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
apply(plugin = "com.android.application")
apply(plugin = "org.jetbrains.kotlin.plugin.compose")
with(pluginManager) {
apply(libs.plugins.android.application)
apply(libs.plugins.compose)
}
val extension = extensions.getByType<ApplicationExtension>()
configureAndroidCompose(extension)
}
}
}

@ -21,6 +21,8 @@ import com.google.samples.apps.nowinandroid.configureBadgingTasks
import com.google.samples.apps.nowinandroid.configureGradleManagedDevices
import com.google.samples.apps.nowinandroid.configureKotlinAndroid
import com.google.samples.apps.nowinandroid.configurePrintApksTask
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
@ -30,10 +32,10 @@ class AndroidApplicationConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.android.application")
apply("org.jetbrains.kotlin.android")
apply("nowinandroid.android.lint")
apply("com.dropbox.dependency-guard")
apply(libs.plugins.android.application)
apply(libs.plugins.kotlin.android)
apply(libs.plugins.nowinandroid.android.lint)
apply(libs.plugins.dependencyGuard)
}
extensions.configure<ApplicationExtension> {

@ -16,7 +16,9 @@
import com.android.build.api.dsl.ApplicationExtension
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension
import com.google.samples.apps.nowinandroid.libs
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.implementation
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
@ -26,17 +28,16 @@ class AndroidApplicationFirebaseConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.google.gms.google-services")
apply("com.google.firebase.firebase-perf")
apply("com.google.firebase.crashlytics")
apply(libs.plugins.gms)
apply(libs.plugins.firebase.perf)
apply(libs.plugins.firebase.crashlytics)
}
dependencies {
val bom = libs.findLibrary("firebase-bom").get()
add("implementation", platform(bom))
"implementation"(libs.findLibrary("firebase.analytics").get())
"implementation"(libs.findLibrary("firebase.performance").get())
"implementation"(libs.findLibrary("firebase.crashlytics").get())
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.performance)
implementation(libs.firebase.crashlytics)
}
extensions.configure<ApplicationExtension> {

@ -17,6 +17,8 @@
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import com.android.build.gradle.internal.dsl.BaseAppModuleExtension
import com.google.samples.apps.nowinandroid.configureJacoco
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.getByType
@ -24,7 +26,7 @@ import org.gradle.kotlin.dsl.getByType
class AndroidApplicationJacocoConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply("jacoco")
pluginManager.apply(libs.plugins.jacoco)
val androidExtension = extensions.getByType<BaseAppModuleExtension>()
androidExtension.buildTypes.configureEach {

@ -16,7 +16,10 @@
import com.android.build.gradle.LibraryExtension
import com.google.samples.apps.nowinandroid.configureGradleManagedDevices
import com.google.samples.apps.nowinandroid.libs
import com.google.samples.apps.nowinandroid.extension.androidTestImplementation
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.implementation
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
@ -25,9 +28,9 @@ import org.gradle.kotlin.dsl.dependencies
class AndroidFeatureConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply {
apply("nowinandroid.android.library")
apply("nowinandroid.android.hilt")
with(pluginManager) {
apply(libs.plugins.nowinandroid.android.library)
apply(libs.plugins.nowinandroid.android.hilt)
}
extensions.configure<LibraryExtension> {
defaultConfig {
@ -39,15 +42,15 @@ class AndroidFeatureConventionPlugin : Plugin<Project> {
}
dependencies {
add("implementation", project(":core:ui"))
add("implementation", project(":core:designsystem"))
implementation(project(":core:ui"))
implementation(project(":core:designsystem"))
add("implementation", libs.findLibrary("androidx.hilt.navigation.compose").get())
add("implementation", libs.findLibrary("androidx.lifecycle.runtimeCompose").get())
add("implementation", libs.findLibrary("androidx.lifecycle.viewModelCompose").get())
add("implementation", libs.findLibrary("androidx.tracing.ktx").get())
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.androidx.lifecycle.runtimeCompose)
implementation(libs.androidx.lifecycle.viewModelCompose)
implementation(libs.androidx.tracing.ktx)
add("androidTestImplementation", libs.findLibrary("androidx.lifecycle.runtimeTesting").get())
androidTestImplementation(libs.androidx.lifecycle.runtimeTesting)
}
}
}

@ -14,7 +14,10 @@
* limitations under the License.
*/
import com.google.samples.apps.nowinandroid.libs
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.implementation
import com.google.samples.apps.nowinandroid.extension.ksp
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies
@ -23,15 +26,14 @@ class AndroidHiltConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.google.devtools.ksp")
apply("dagger.hilt.android.plugin")
apply(libs.plugins.ksp)
apply(libs.plugins.hilt)
}
dependencies {
"implementation"(libs.findLibrary("hilt.android").get())
"ksp"(libs.findLibrary("hilt.compiler").get())
implementation(libs.hilt.android)
ksp(libs.hilt.compiler)
}
}
}

@ -16,6 +16,8 @@
import com.android.build.gradle.LibraryExtension
import com.google.samples.apps.nowinandroid.configureAndroidCompose
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
@ -24,12 +26,13 @@ import org.gradle.kotlin.dsl.getByType
class AndroidLibraryComposeConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
apply(plugin = "com.android.library")
apply(plugin = "org.jetbrains.kotlin.plugin.compose")
with(pluginManager) {
apply(libs.plugins.android.library)
apply(libs.plugins.compose)
}
val extension = extensions.getByType<LibraryExtension>()
configureAndroidCompose(extension)
}
}
}

@ -21,7 +21,10 @@ import com.google.samples.apps.nowinandroid.configureGradleManagedDevices
import com.google.samples.apps.nowinandroid.configureKotlinAndroid
import com.google.samples.apps.nowinandroid.configurePrintApksTask
import com.google.samples.apps.nowinandroid.disableUnnecessaryAndroidTests
import com.google.samples.apps.nowinandroid.libs
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.implementation
import com.google.samples.apps.nowinandroid.extension.libs
import com.google.samples.apps.nowinandroid.extension.testImplementation
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
@ -32,9 +35,9 @@ class AndroidLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
apply("nowinandroid.android.lint")
apply(libs.plugins.android.library)
apply(libs.plugins.kotlin.android)
apply(libs.plugins.nowinandroid.android.lint)
}
extensions.configure<LibraryExtension> {
@ -52,9 +55,9 @@ class AndroidLibraryConventionPlugin : Plugin<Project> {
disableUnnecessaryAndroidTests(target)
}
dependencies {
add("testImplementation", kotlin("test"))
testImplementation(kotlin("test"))
add("implementation", libs.findLibrary("androidx.tracing.ktx").get())
implementation(libs.androidx.tracing.ktx)
}
}
}

@ -15,9 +15,10 @@
*/
import com.android.build.api.dsl.LibraryExtension
import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import com.android.build.api.variant.LibraryAndroidComponentsExtension
import com.google.samples.apps.nowinandroid.configureJacoco
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.getByType
@ -25,7 +26,7 @@ import org.gradle.kotlin.dsl.getByType
class AndroidLibraryJacocoConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply("jacoco")
pluginManager.apply(libs.plugins.jacoco)
val androidExtension = extensions.getByType<LibraryExtension>()
androidExtension.buildTypes.configureEach {

@ -17,6 +17,9 @@
import com.android.build.api.dsl.ApplicationExtension
import com.android.build.api.dsl.LibraryExtension
import com.android.build.api.dsl.Lint
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.hasPlugin
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
@ -25,14 +28,14 @@ class AndroidLintConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
when {
pluginManager.hasPlugin("com.android.application") ->
pluginManager.hasPlugin(libs.plugins.android.application) ->
configure<ApplicationExtension> { lint(Lint::configure) }
pluginManager.hasPlugin("com.android.library") ->
pluginManager.hasPlugin(libs.plugins.android.library) ->
configure<LibraryExtension> { lint(Lint::configure) }
else -> {
pluginManager.apply("com.android.lint")
pluginManager.apply(libs.plugins.android.lint)
configure<Lint>(Lint::configure)
}
}

@ -16,7 +16,10 @@
import androidx.room.gradle.RoomExtension
import com.google.devtools.ksp.gradle.KspExtension
import com.google.samples.apps.nowinandroid.libs
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.implementation
import com.google.samples.apps.nowinandroid.extension.ksp
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
@ -26,8 +29,10 @@ class AndroidRoomConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply("androidx.room")
pluginManager.apply("com.google.devtools.ksp")
with(pluginManager) {
apply(libs.plugins.room)
apply(libs.plugins.ksp)
}
extensions.configure<KspExtension> {
arg("room.generateKotlin", "true")
@ -41,9 +46,9 @@ class AndroidRoomConventionPlugin : Plugin<Project> {
}
dependencies {
add("implementation", libs.findLibrary("room.runtime").get())
add("implementation", libs.findLibrary("room.ktx").get())
add("ksp", libs.findLibrary("room.compiler").get())
implementation(libs.room.runtime)
implementation(libs.room.ktx)
ksp(libs.room.compiler)
}
}
}

@ -17,6 +17,8 @@
import com.android.build.gradle.TestExtension
import com.google.samples.apps.nowinandroid.configureGradleManagedDevices
import com.google.samples.apps.nowinandroid.configureKotlinAndroid
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
@ -25,8 +27,8 @@ class AndroidTestConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("com.android.test")
apply("org.jetbrains.kotlin.android")
apply(libs.plugins.android.test)
apply(libs.plugins.kotlin.android)
}
extensions.configure<TestExtension> {

@ -15,6 +15,8 @@
*/
import com.google.samples.apps.nowinandroid.configureKotlinJvm
import com.google.samples.apps.nowinandroid.extension.apply
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Plugin
import org.gradle.api.Project
@ -22,8 +24,8 @@ class JvmLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(pluginManager) {
apply("org.jetbrains.kotlin.jvm")
apply("nowinandroid.android.lint")
apply(libs.plugins.kotlin.jvm)
apply(libs.plugins.nowinandroid.android.lint)
}
configureKotlinJvm()
}

@ -17,6 +17,10 @@
package com.google.samples.apps.nowinandroid
import com.android.build.api.dsl.CommonExtension
import com.google.samples.apps.nowinandroid.extension.androidTestImplementation
import com.google.samples.apps.nowinandroid.extension.debugImplementation
import com.google.samples.apps.nowinandroid.extension.implementation
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Project
import org.gradle.api.provider.Provider
import org.gradle.kotlin.dsl.assign
@ -36,11 +40,10 @@ internal fun Project.configureAndroidCompose(
}
dependencies {
val bom = libs.findLibrary("androidx-compose-bom").get()
add("implementation", platform(bom))
add("androidTestImplementation", platform(bom))
add("implementation", libs.findLibrary("androidx-compose-ui-tooling-preview").get())
add("debugImplementation", libs.findLibrary("androidx-compose-ui-tooling").get())
implementation(platform(libs.androidx.compose.bom))
androidTestImplementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.compose.ui.tooling.preview)
debugImplementation(libs.androidx.compose.ui.tooling)
}
testOptions {

@ -19,6 +19,7 @@ package com.google.samples.apps.nowinandroid
import com.android.build.api.artifact.ScopedArtifact
import com.android.build.api.variant.AndroidComponentsExtension
import com.android.build.api.variant.ScopedArtifacts
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.file.RegularFile
@ -59,7 +60,7 @@ internal fun Project.configureJacoco(
androidComponentsExtension: AndroidComponentsExtension<*, *, *>,
) {
configure<JacocoPluginExtension> {
toolVersion = libs.findVersion("jacoco").get().toString()
toolVersion = libs.versions.jacoco.get()
}
androidComponentsExtension.onVariants { variant ->

@ -17,6 +17,7 @@
package com.google.samples.apps.nowinandroid
import com.android.build.api.dsl.CommonExtension
import com.google.samples.apps.nowinandroid.extension.libs
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginExtension
@ -54,7 +55,7 @@ internal fun Project.configureKotlinAndroid(
configureKotlin<KotlinAndroidProjectExtension>()
dependencies {
add("coreLibraryDesugaring", libs.findLibrary("android.desugarJdkLibs").get())
add("coreLibraryDesugaring", libs.android.desugarJdkLibs)
}
}

@ -1,25 +0,0 @@
/*
* Copyright 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.samples.apps.nowinandroid
import org.gradle.api.Project
import org.gradle.api.artifacts.VersionCatalog
import org.gradle.api.artifacts.VersionCatalogsExtension
import org.gradle.kotlin.dsl.getByType
val Project.libs
get(): VersionCatalog = extensions.getByType<VersionCatalogsExtension>().named("libs")

@ -0,0 +1,34 @@
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.samples.apps.nowinandroid.extension
import org.gradle.kotlin.dsl.DependencyHandlerScope
internal fun DependencyHandlerScope.implementation(dependency: Any) =
dependencies.add("implementation", dependency)
internal fun DependencyHandlerScope.testImplementation(dependency: Any) =
dependencies.add("testImplementation", dependency)
internal fun DependencyHandlerScope.androidTestImplementation(dependency: Any) =
dependencies.add("androidTestImplementation", dependency)
internal fun DependencyHandlerScope.debugImplementation(dependency: Any) =
dependencies.add("debugImplementation", dependency)
internal fun DependencyHandlerScope.ksp(dependency: Any) =
dependencies.add("ksp", dependency)

@ -0,0 +1,34 @@
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.samples.apps.nowinandroid.extension
import org.gradle.api.plugins.PluginManager
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderConvertible
import org.gradle.plugin.use.PluginDependency
internal fun PluginManager.apply(pluginProvider: Provider<PluginDependency>) {
apply(pluginProvider.get().pluginId)
}
internal fun PluginManager.apply(pluginProvider: ProviderConvertible<PluginDependency>) {
apply(pluginProvider.asProvider())
}
internal fun PluginManager.hasPlugin(pluginProvider: Provider<PluginDependency>): Boolean {
return hasPlugin(pluginProvider.get().pluginId)
}

@ -0,0 +1,24 @@
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.samples.apps.nowinandroid.extension
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.Project
import org.gradle.kotlin.dsl.getByType
val Project.libs
get(): LibrariesForLibs = extensions.getByType()

@ -156,6 +156,7 @@ room-gradlePlugin = { group = "androidx.room", name = "room-gradle-plugin", vers
[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }
android-lint = { id = "com.android.lint", version.ref = "androidGradlePlugin" }
android-test = { id = "com.android.test", version.ref = "androidGradlePlugin" }
baselineprofile = { id = "androidx.baselineprofile", version.ref = "androidxMacroBenchmark"}
compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
@ -164,6 +165,8 @@ firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "
firebase-perf = { id = "com.google.firebase.firebase-perf", version.ref = "firebasePerfPlugin" }
gms = { id = "com.google.gms.google-services", version.ref = "gmsPlugin" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
jacoco = { id = "jacoco", version.ref = "jacoco" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }

Loading…
Cancel
Save