kotlin-plugins: convert to full plugins

This commit is contained in:
Harsh Shandilya 2022-06-05 03:56:37 +05:30
parent fe3ca3f7d8
commit 98f49e7b69
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
13 changed files with 261 additions and 157 deletions

View file

@ -24,6 +24,35 @@ afterEvaluate {
}
}
gradlePlugin {
plugins {
register("binary-compatibility") {
id = "com.github.android-password-store.binary-compatibility"
implementationClass = "dev.msfjarvis.aps.gradle.BinaryCompatibilityPlugin"
}
register("kotlin-android") {
id = "com.github.android-password-store.kotlin-android"
implementationClass = "dev.msfjarvis.aps.gradle.KotlinAndroidPlugin"
}
register("kotlin-common") {
id = "com.github.android-password-store.kotlin-common"
implementationClass = "dev.msfjarvis.aps.gradle.KotlinCommonPlugin"
}
register("kotlin-kapt") {
id = "com.github.android-password-store.kotlin-kapt"
implementationClass = "dev.msfjarvis.aps.gradle.KotlinKaptPlugin"
}
register("kotlin-library") {
id = "com.github.android-password-store.kotlin-library"
implementationClass = "dev.msfjarvis.aps.gradle.KotlinLibraryPlugin"
}
register("spotless") {
id = "com.github.android-password-store.spotless"
implementationClass = "dev.msfjarvis.aps.gradle.SpotlessPlugin"
}
}
}
dependencies {
implementation(libs.build.agp)
implementation(libs.build.binarycompat)
@ -38,7 +67,7 @@ configurations.all {
val overridenVersion = System.getenv(overrideName)
if (!overridenVersion.isNullOrEmpty()) {
project.logger.lifecycle(
"Overriding dependency ${requested.group}:${requested.name} to version ${overridenVersion}"
"Overriding dependency ${requested.group}:${requested.name} to version $overridenVersion"
)
useVersion(overridenVersion)
}

View file

@ -1,21 +0,0 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
plugins { id("org.jetbrains.kotlinx.binary-compatibility-validator") }
apiValidation {
ignoredProjects =
mutableSetOf(
"app",
"coroutine-utils",
"coroutine-utils-testing",
"crypto-common",
"crypto-pgpainless",
"format-common",
"diceware",
"random",
"sentry-stub",
)
}

View file

@ -1,9 +0,0 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
plugins {
kotlin("android")
id("com.github.android-password-store.kotlin-common")
}

View file

@ -1,38 +0,0 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import org.gradle.api.JavaVersion
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val additionalCompilerArgs =
listOf(
"-opt-in=kotlin.RequiresOptIn",
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true",
)
tasks.withType<JavaCompile>().configureEach {
sourceCompatibility = JavaVersion.VERSION_11.toString()
targetCompatibility = JavaVersion.VERSION_11.toString()
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
allWarningsAsErrors = true
jvmTarget = JavaVersion.VERSION_11.toString()
freeCompilerArgs = freeCompilerArgs + additionalCompilerArgs
languageVersion = "1.5"
}
}
tasks.withType<Test>().configureEach {
maxParallelForks = Runtime.getRuntime().availableProcessors() * 2
testLogging { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) }
doNotTrackState("We want tests to always run even if Gradle thinks otherwise")
}

View file

@ -1,43 +0,0 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import org.gradle.api.Project
plugins {
kotlin("android")
kotlin("kapt")
}
afterEvaluate {
kapt {
javacOptions {
if (hasDaggerCompilerDependency()) {
// https://dagger.dev/dev-guide/compiler-options#fastinit-mode
option("-Adagger.fastInit=enabled")
// Enable the better, experimental error messages
// https://github.com/google/dagger/commit/0d2505a727b54f47b8677f42dd4fc5c1924e37f5
option("-Adagger.experimentalDaggerErrorMessages=enabled")
// Share test components for when we start leveraging Hilt for tests
// https://github.com/google/dagger/releases/tag/dagger-2.34
option("-Adagger.hilt.shareTestComponents=true")
// KAPT nests errors causing real issues to be suppressed in CI logs
option("-Xmaxerrs", 500)
// Enables per-module validation for faster error detection
// https://github.com/google/dagger/commit/325b516ac6a53d3fc973d247b5231fafda9870a2
option("-Adagger.moduleBindingValidation=ERROR")
}
}
}
}
// disable kapt tasks for unit tests
tasks
.matching { it.name.startsWith("kapt") && it.name.endsWith("UnitTestKotlin") }
.configureEach { enabled = false }
fun Project.hasDaggerCompilerDependency(): Boolean {
return configurations.any {
it.dependencies.any { dependency -> dependency.name == "hilt-compiler" }
}
}

View file

@ -1,17 +0,0 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { id("com.github.android-password-store.kotlin-common") }
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
if (!name.contains("test", ignoreCase = true)) {
freeCompilerArgs += listOf("-Xexplicit-api=strict")
}
}
}

View file

@ -1,28 +0,0 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
plugins { id("com.diffplug.spotless") }
val KTFMT_VERSION = "0.37"
spotless {
kotlin {
ktfmt(KTFMT_VERSION).googleStyle()
target("**/*.kt")
targetExclude("**/build/")
}
kotlinGradle {
ktfmt(KTFMT_VERSION).googleStyle()
target("**/*.kts")
targetExclude("**/build/")
}
format("xml") {
target("**/*.xml")
targetExclude("**/build/", ".idea/")
trimTrailingWhitespace()
indentWithSpaces()
endWithNewline()
}
}

View file

@ -0,0 +1,33 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
package dev.msfjarvis.aps.gradle
import kotlinx.validation.ApiValidationExtension
import kotlinx.validation.BinaryCompatibilityValidatorPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.getByType
@Suppress("Unused")
class BinaryCompatibilityPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.apply(BinaryCompatibilityValidatorPlugin::class)
project.extensions.getByType<ApiValidationExtension>().ignoredProjects =
mutableSetOf(
"app",
"coroutine-utils",
"coroutine-utils-testing",
"crypto-common",
"crypto-pgpainless",
"format-common",
"diceware",
"random",
"sentry-stub",
)
}
}

View file

@ -0,0 +1,22 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
package dev.msfjarvis.aps.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper
@Suppress("Unused")
class KotlinAndroidPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.run {
apply(KotlinAndroidPluginWrapper::class)
apply(KotlinCommonPlugin::class)
}
}
}

View file

@ -0,0 +1,50 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
package dev.msfjarvis.aps.gradle
import org.gradle.api.JavaVersion
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.testing.Test
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@Suppress("Unused")
class KotlinCommonPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.tasks.run {
withType<JavaCompile>().configureEach {
sourceCompatibility = JavaVersion.VERSION_11.toString()
targetCompatibility = JavaVersion.VERSION_11.toString()
}
withType<KotlinCompile>().configureEach {
kotlinOptions {
allWarningsAsErrors = true
jvmTarget = JavaVersion.VERSION_11.toString()
freeCompilerArgs = freeCompilerArgs + ADDITIONAL_COMPILER_ARGS
languageVersion = "1.5"
}
}
withType<Test>().configureEach {
maxParallelForks = Runtime.getRuntime().availableProcessors() * 2
testLogging { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) }
doNotTrackState("We want tests to always run even if Gradle thinks otherwise")
}
}
}
private companion object {
private val ADDITIONAL_COMPILER_ARGS =
listOf(
"-opt-in=kotlin.RequiresOptIn",
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true",
)
}
}

View file

@ -0,0 +1,55 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
package dev.msfjarvis.aps.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.getByType
import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin
import org.jetbrains.kotlin.gradle.plugin.KaptExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper
@Suppress("Unused")
class KotlinKaptPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.run {
apply(KotlinAndroidPluginWrapper::class)
apply(Kapt3GradleSubplugin::class)
}
project.afterEvaluate {
project.extensions.getByType<KaptExtension>().run {
javacOptions {
if (hasDaggerCompilerDependency()) {
// https://dagger.dev/dev-guide/compiler-options#fastinit-mode
option("-Adagger.fastInit=enabled")
// Enable the better, experimental error messages
// https://github.com/google/dagger/commit/0d2505a727b54f47b8677f42dd4fc5c1924e37f5
option("-Adagger.experimentalDaggerErrorMessages=enabled")
// Share test components for when we start leveraging Hilt for tests
// https://github.com/google/dagger/releases/tag/dagger-2.34
option("-Adagger.hilt.shareTestComponents=true")
// KAPT nests errors causing real issues to be suppressed in CI logs
option("-Xmaxerrs", 500)
// Enables per-module validation for faster error detection
// https://github.com/google/dagger/commit/325b516ac6a53d3fc973d247b5231fafda9870a2
option("-Adagger.moduleBindingValidation=ERROR")
}
}
}
}
project.tasks
.matching { it.name.startsWith("kapt") && it.name.endsWith("UnitTestKotlin") }
.configureEach { enabled = false }
}
private fun Project.hasDaggerCompilerDependency(): Boolean {
return configurations.any {
it.dependencies.any { dependency -> dependency.name == "hilt-compiler" }
}
}
}

View file

@ -0,0 +1,27 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
package dev.msfjarvis.aps.gradle
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@Suppress("Unused")
class KotlinLibraryPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.apply(KotlinCommonPlugin::class)
project.tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
if (!name.contains("test", ignoreCase = true)) {
freeCompilerArgs = freeCompilerArgs + listOf("-Xexplicit-api=strict")
}
}
}
}
}

View file

@ -0,0 +1,44 @@
/*
* Copyright © 2014-2021 The Android Password Store Authors. All Rights Reserved.
* SPDX-License-Identifier: GPL-3.0-only
*/
package dev.msfjarvis.aps.gradle
import com.diffplug.gradle.spotless.SpotlessExtension
import com.diffplug.gradle.spotless.SpotlessPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.getByType
@Suppress("Unused")
class SpotlessPlugin : Plugin<Project> {
override fun apply(project: Project) {
project.pluginManager.apply(SpotlessPlugin::class)
project.extensions.getByType<SpotlessExtension>().run {
kotlin {
ktfmt(KTFMT_VERSION).googleStyle()
target("**/*.kt")
targetExclude("**/build/")
}
kotlinGradle {
ktfmt(KTFMT_VERSION).googleStyle()
target("**/*.kts")
targetExclude("**/build/")
}
format("xml") {
target("**/*.xml")
targetExclude("**/build/", ".idea/")
trimTrailingWhitespace()
indentWithSpaces()
endWithNewline()
}
}
}
private companion object {
private const val KTFMT_VERSION = "0.37"
}
}