diff --git a/build-scripts/build.gradle.kts b/build-scripts/build.gradle.kts index 1cff390..3d3fef8 100644 --- a/build-scripts/build.gradle.kts +++ b/build-scripts/build.gradle.kts @@ -2,6 +2,8 @@ plugins { `kotlin-dsl` } +group = "ru.vladislavsumin" + dependencies { // Мы хотим получать доступ к libs из наших convention плагинов, но гредл на текущий момент не умеет прокидывать // version catalogs. Поэтому используем костыль отсюда - https://github.com/gradle/gradle/issues/15383 diff --git a/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/Configuration.kt b/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/Configuration.kt index 9d2bf83..2e1601b 100644 --- a/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/Configuration.kt +++ b/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/Configuration.kt @@ -1,5 +1,7 @@ package ru.vladislavsumin.configuration +import org.gradle.api.Project +import ru.vladislavsumin.utils.isDslAccessors import kotlin.reflect.KClass /** @@ -11,7 +13,10 @@ import kotlin.reflect.KClass */ @Suppress("UnnecessaryAbstractClass") // Создавать этот класс напрямую не имеет смысла abstract class Configuration( - private val basePath: String, + @PublishedApi + internal val project: Project, + @PublishedApi + internal val basePath: String, private val propertyProvider: PropertyProvider, ) { /** @@ -19,6 +24,7 @@ abstract class Configuration( * @param relativePath путь, который будет добавлен к пути родителя для получения финального пути этой конфигурации. */ constructor(relativePath: String, parent: Configuration) : this( + parent.project, "${parent.basePath}.$relativePath", parent.propertyProvider, ) @@ -26,8 +32,14 @@ abstract class Configuration( protected inline fun property(relativePath: String, defaultValue: T): T = propertyOrNull(relativePath, T::class) ?: defaultValue - protected inline fun property(relativePath: String): T = - propertyOrNull(relativePath, T::class)!! + protected inline fun property(relativePath: String): T { + val prop = propertyOrNull(relativePath, T::class) + return when { + prop != null -> prop + project.isDslAccessors -> fakeDefaultValue() + else -> error("Property $basePath.$relativePath is required but not set") + } + } protected inline fun propertyOrNull(relativePath: String): T? = propertyOrNull(relativePath, T::class) @@ -51,6 +63,16 @@ abstract class Configuration( else -> Error("Unsupported cast to ${kClass.simpleName}") } as T } + + @PublishedApi + internal inline fun fakeDefaultValue(): T { + return when (T::class) { + String::class -> "" + Boolean::class -> false + Integer::class -> 0 + else -> Error("Unsupported cast to ${T::class.simpleName}") + } as T + } } fun interface PropertyProvider { diff --git a/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/ProjectConfiguration.kt b/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/ProjectConfiguration.kt index 2a7fe1e..648c218 100644 --- a/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/ProjectConfiguration.kt +++ b/build-scripts/src/main/kotlin/ru/vladislavsumin/configuration/ProjectConfiguration.kt @@ -8,10 +8,11 @@ import org.gradle.kotlin.dsl.findByType * Файл пропертей проекта, содержит dsl для доступа к любым проперти используемым при сборке. */ @Suppress("UnnecessaryAbstractClass") -open class ProjectConfiguration(propertyProvider: PropertyProvider) : - Configuration("ru.vs", propertyProvider) { +open class ProjectConfiguration(project: Project, propertyProvider: PropertyProvider) : + Configuration(project, "ru.vs", propertyProvider) { val version = property("version", "0.0.1") + val basePackage = property("basePackage") val core = CoreConfiguration() val signing = Signing() val sonatype = Sonatype() @@ -60,6 +61,7 @@ val Project.projectConfiguration: ProjectConfiguration get() = rootProject.extensions.findByType() ?: rootProject.extensions.create( ProjectConfiguration::class.java.simpleName, + project, propertyProvider, ) diff --git a/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/base.gradle.kts b/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/base.gradle.kts index 0e173bb..1bbb24c 100644 --- a/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/base.gradle.kts +++ b/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/base.gradle.kts @@ -2,6 +2,7 @@ package ru.vladislavsumin.convention.android import ru.vladislavsumin.configuration.projectConfiguration import ru.vladislavsumin.utils.android +import ru.vladislavsumin.utils.protectFromDslAccessors /** * Базовая настройка android плагина без привязки к конкретной имплементации (application/library/итд). @@ -9,17 +10,19 @@ import ru.vladislavsumin.utils.android val configuration = project.projectConfiguration -android { - setCompileSdkVersion(configuration.core.android.compileSdk) +protectFromDslAccessors { + android { + setCompileSdkVersion(configuration.core.android.compileSdk) - defaultConfig { - minSdk = configuration.core.android.minSdk - targetSdk = configuration.core.android.targetSdk - } + defaultConfig { + minSdk = configuration.core.android.minSdk + targetSdk = configuration.core.android.targetSdk + } - compileOptions { - val version = JavaVersion.toVersion(configuration.core.jvmVersion) - sourceCompatibility = version - targetCompatibility = version + compileOptions { + val version = JavaVersion.toVersion(configuration.core.jvmVersion) + sourceCompatibility = version + targetCompatibility = version + } } } diff --git a/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/default-namespace.gradle.kts b/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/default-namespace.gradle.kts index 215093f..e092dba 100644 --- a/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/default-namespace.gradle.kts +++ b/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/android/default-namespace.gradle.kts @@ -1,12 +1,16 @@ package ru.vladislavsumin.convention.android +import ru.vladislavsumin.configuration.projectConfiguration import ru.vladislavsumin.utils.android import ru.vladislavsumin.utils.fullName +import ru.vladislavsumin.utils.protectFromDslAccessors /** * Устанавливает базовый namespace для android модулей вида ru.vladislavsumin.***, где *** заменяются на полное имя проекта. */ -android { - namespace = "ru.vladislavsumin.${project.fullName()}" +protectFromDslAccessors { + android { + namespace = "${project.projectConfiguration.basePackage}.${project.fullName()}" + } } diff --git a/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/publication/group.gradle.kts b/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/publication/group.gradle.kts index 4de9325..584e50d 100644 --- a/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/publication/group.gradle.kts +++ b/build-scripts/src/main/kotlin/ru/vladislavsumin/convention/publication/group.gradle.kts @@ -1,9 +1,10 @@ package ru.vladislavsumin.convention.publication +import ru.vladislavsumin.configuration.projectConfiguration import ru.vladislavsumin.utils.fullName /** * Устанавливает группу проекта основываясь на его пути */ -group = "ru.vladislavsumin.${project.parent!!.fullName()}" +group = "${project.projectConfiguration.basePackage}.${project.parent!!.fullName()}" diff --git a/build-scripts/src/main/kotlin/ru/vladislavsumin/utils/DslAccessorsUtils.kt b/build-scripts/src/main/kotlin/ru/vladislavsumin/utils/DslAccessorsUtils.kt new file mode 100644 index 0000000..7e2af7c --- /dev/null +++ b/build-scripts/src/main/kotlin/ru/vladislavsumin/utils/DslAccessorsUtils.kt @@ -0,0 +1,14 @@ +package ru.vladislavsumin.utils + +import org.gradle.api.Project + +/** + * Защита от выполнения кода при генерации kotlin dsl при использовании composite builds содержащих convention плагины. + */ +inline fun Project.protectFromDslAccessors(block: () -> Unit) { + if (!isDslAccessors) { + block() + } +} + +val Project.isDslAccessors: Boolean get() = name == "gradle-kotlin-dsl-accessors" \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index dfdcc0a..69c973e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,6 @@ +# Project +ru.vs.basePackage=ru.vladislavsumin + # Kotlin kotlin.code.style=official