From 7cba035f805471a6850f9416c31f1cd9c66f5f62 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 1 Feb 2018 02:17:56 +0300 Subject: [PATCH] Ensure tasks using android sdk or android jar have proper dependencies A test task, that uses android dependency but does not depend on a corresponding configuration, would fail when it was run after 'clean' task. I've extracted 'useAndroidSdk', 'useAndroidJar' extensions making it harder for a developer to forget to set up task dependencies. --- buildSrc/src/main/kotlin/tasks.kt | 26 +++++++++++++++++++ idea/idea-android/build.gradle.kts | 7 +---- idea/idea-gradle/build.gradle.kts | 7 +---- .../build.gradle | 11 ++------ .../build.gradle.kts | 4 +-- .../android-extensions-idea/build.gradle.kts | 11 ++------ .../android-extensions-jps/build.gradle.kts | 6 +---- 7 files changed, 34 insertions(+), 38 deletions(-) diff --git a/buildSrc/src/main/kotlin/tasks.kt b/buildSrc/src/main/kotlin/tasks.kt index 5796f045854..d4093d18d83 100644 --- a/buildSrc/src/main/kotlin/tasks.kt +++ b/buildSrc/src/main/kotlin/tasks.kt @@ -24,6 +24,7 @@ import org.gradle.api.tasks.testing.Test import org.gradle.kotlin.dsl.extra import org.gradle.kotlin.dsl.task import org.gradle.kotlin.dsl.the +import org.gradle.kotlin.dsl.* import java.lang.Character.isLowerCase import java.lang.Character.isUpperCase @@ -81,3 +82,28 @@ private inline fun String.isFirstChar(f: (Char) -> Boolean) = isNotEmpty() && f( inline fun Project.getOrCreateTask(taskName: String, body: T.() -> Unit): T = (tasks.findByName(taskName)?.let { it as T } ?: task(taskName)).apply { body() } + +private fun Test.useAndroidConfiguration(systemPropertyName: String, configName: String) { + val configuration = with(project) { + configurations.getOrCreate(configName) + .also { + dependencies.add( + configName, + dependencies.project(":custom-dependencies:android-sdk", configuration = configName) + ) + } + } + + dependsOn(configuration) + doFirst { + systemProperty(systemPropertyName, configuration.singleFile.canonicalPath) + } +} + +fun Test.useAndroidSdk() { + useAndroidConfiguration(systemPropertyName = "android.sdk", configName = "androidSdk") +} + +fun Test.useAndroidJar() { + useAndroidConfiguration(systemPropertyName = "android.jar", configName = "androidJar") +} \ No newline at end of file diff --git a/idea/idea-android/build.gradle.kts b/idea/idea-android/build.gradle.kts index 8e2a947e92c..65d88c6331c 100644 --- a/idea/idea-android/build.gradle.kts +++ b/idea/idea-android/build.gradle.kts @@ -3,8 +3,6 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile apply { plugin("kotlin") } -val androidSdk by configurations.creating - dependencies { testRuntime(intellijDep()) @@ -59,8 +57,6 @@ dependencies { testRuntime(intellijPluginDep("junit")) testRuntime(intellijPluginDep("maven")) testRuntime(intellijPluginDep("testng")) - - androidSdk(project(":custom-dependencies:android-sdk", configuration = "androidSdk")) } sourceSets { @@ -69,10 +65,9 @@ sourceSets { } projectTest { - dependsOn(androidSdk) workingDir = rootDir + useAndroidSdk() doFirst { - systemProperty("android.sdk", androidSdk.singleFile.canonicalPath) systemProperty("idea.home.path", intellijRootDir().canonicalPath) } } diff --git a/idea/idea-gradle/build.gradle.kts b/idea/idea-gradle/build.gradle.kts index 0627d7fff71..26f6d461211 100644 --- a/idea/idea-gradle/build.gradle.kts +++ b/idea/idea-gradle/build.gradle.kts @@ -1,8 +1,6 @@ apply { plugin("kotlin") } -val androidSdk by configurations.creating - dependencies { testRuntime(intellijDep()) @@ -46,8 +44,6 @@ dependencies { testRuntime(intellijPluginDep("coverage")) { includeJars("jacocoant") } testRuntime(intellijPluginDep("maven")) testRuntime(intellijPluginDep("android")) - - androidSdk(project(":custom-dependencies:android-sdk", configuration = "androidSdk")) } sourceSets { @@ -62,9 +58,8 @@ testsJar() projectTest { workingDir = rootDir - dependsOn(androidSdk) + useAndroidSdk() doFirst { - systemProperty("android.sdk", androidSdk.singleFile.canonicalPath) systemProperty("idea.home.path", intellijRootDir().canonicalPath) } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle index 32bb62a6ea7..3cd5628003e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle @@ -7,10 +7,6 @@ repositories { jcenter() } -configurations { - androidSdk -} - dependencies { testCompile project(':kotlin-gradle-plugin') testCompile project(':kotlin-gradle-plugin').sourceSets.test.output @@ -29,8 +25,6 @@ dependencies { testCompile gradleApi() testRuntime project(path: ':kotlin-android-extensions', configuration: 'runtimeJar') - - androidSdk project(path: ":custom-dependencies:android-sdk", configuration: "androidSdk") } // Include Gradle task properties validation into the testing procedure: @@ -87,9 +81,8 @@ tasks.withType(Test) { if (mavenLocalRepo != null) { systemProperty("maven.repo.local", mavenLocalRepo) } - doFirst { - systemProperty("android.sdk", project.configurations["androidSdk"].singleFile.getCanonicalPath()) - } + + TasksKt.useAndroidSdk(it) testLogging { // set options for log level LIFECYCLE diff --git a/plugins/android-extensions/android-extensions-compiler/build.gradle.kts b/plugins/android-extensions/android-extensions-compiler/build.gradle.kts index ff9790ec471..a1f9fcaf1f8 100644 --- a/plugins/android-extensions/android-extensions-compiler/build.gradle.kts +++ b/plugins/android-extensions/android-extensions-compiler/build.gradle.kts @@ -4,7 +4,6 @@ description = "Kotlin Android Extensions Compiler" apply { plugin("kotlin") } val robolectricClasspath by configurations.creating -val androidJar by configurations.creating dependencies { testCompile(intellijCoreDep()) { includeJars("intellij-core") } @@ -30,7 +29,6 @@ dependencies { testRuntime(intellijPluginDep("junit")) { includeJars("idea-junit", "resources_en") } robolectricClasspath(commonDep("org.robolectric", "robolectric")) - androidJar(project(":custom-dependencies:android-sdk", configuration = "androidJar")) } sourceSets { @@ -54,10 +52,10 @@ projectTest { environment("ANDROID_EXTENSIONS_RUNTIME_CLASSES", getSourceSetsFrom(":kotlin-android-extensions-runtime")["main"].output.classesDirs.asPath) dependsOn(":dist") workingDir = rootDir + useAndroidJar() doFirst { val androidPluginPath = File(intellijRootDir(), "plugins/android").canonicalPath systemProperty("ideaSdk.androidPlugin.path", androidPluginPath) systemProperty("robolectric.classpath", robolectricClasspath.asPath) - systemProperty("android.jar", androidJar.singleFile.canonicalPath) } } diff --git a/plugins/android-extensions/android-extensions-idea/build.gradle.kts b/plugins/android-extensions/android-extensions-idea/build.gradle.kts index 5946ae253c7..68a4b01069b 100644 --- a/plugins/android-extensions/android-extensions-idea/build.gradle.kts +++ b/plugins/android-extensions/android-extensions-idea/build.gradle.kts @@ -5,9 +5,6 @@ apply { plugin("kotlin") } jvmTarget = "1.6" -val androidSdk by configurations.creating -val androidJar by configurations.creating - dependencies { testRuntime(intellijDep()) @@ -53,9 +50,6 @@ dependencies { testRuntime(intellijPluginDep("java-decompiler")) testRuntime(intellijPluginDep("maven")) testRuntime(intellijPluginDep("android")) - - androidSdk(project(":custom-dependencies:android-sdk", configuration = "androidSdk")) - androidJar(project(":custom-dependencies:android-sdk", configuration = "androidJar")) } sourceSets { @@ -67,11 +61,10 @@ testsJar {} projectTest { dependsOn(":kotlin-android-extensions-runtime:dist") - dependsOn(androidSdk) workingDir = rootDir + useAndroidSdk() + useAndroidJar() doFirst { - systemProperty("android.sdk", androidSdk.singleFile.canonicalPath) - systemProperty("android.jar", androidJar.singleFile.canonicalPath) systemProperty("idea.home.path", intellijRootDir().canonicalPath) } } diff --git a/plugins/android-extensions/android-extensions-jps/build.gradle.kts b/plugins/android-extensions/android-extensions-jps/build.gradle.kts index 8ad9325fcaa..6fb8e3c719b 100644 --- a/plugins/android-extensions/android-extensions-jps/build.gradle.kts +++ b/plugins/android-extensions/android-extensions-jps/build.gradle.kts @@ -1,8 +1,6 @@ apply { plugin("kotlin") } -val androidSdk by configurations.creating - dependencies { testRuntime(intellijDep()) @@ -25,8 +23,6 @@ dependencies { testRuntime(intellijPluginDep("android")) testRuntime(intellijDep("jps-build-test")) testRuntime(intellijDep("jps-standalone")) - - androidSdk(project(":custom-dependencies:android-sdk", configuration = "androidSdk")) } sourceSets { @@ -36,8 +32,8 @@ sourceSets { projectTest { workingDir = rootDir + useAndroidSdk() doFirst { - systemProperty("android.sdk", androidSdk.singleFile.canonicalPath) systemProperty("idea.home.path", intellijRootDir().canonicalPath) } }