Improve ':kotlinx-coroutines-core' substitution for all modules. (#2748)
* Improve ':kotlinx-coroutines-core' substitution for all modules.
Ensure "org.jetbrains.kotlinx:kotlinx-coroutines-core" transitive
dependencies are substituted with project itself to avoid test errors.
Co-authored-by: Yahor Berdnikau <egorr.berd@gmail.com>
diff --git a/build.gradle b/build.gradle
index fc52d8c..225634a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,8 +1,9 @@
/*
* Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
+
+import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.konan.target.HostManager
-import org.gradle.util.VersionNumber
apply plugin: 'jdk-convention'
apply from: rootProject.file("gradle/experimental.gradle")
@@ -74,9 +75,6 @@
CacheRedirector.configureBuildScript(buildscript, rootProject)
}
-
-import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
-
// todo:KLUDGE: Hierarchical project structures are not fully supported in IDEA, enable only for a regular built
if (!Idea.active) {
ext.set("kotlin.mpp.enableGranularSourceSetsMetadata", "true")
@@ -288,3 +286,34 @@
}
}
}
+
+// Opt-in for build scan in order to troubleshoot Gradle on TC
+if (hasProperty('buildScan')) {
+ buildScan {
+ termsOfServiceUrl = 'https://gradle.com/terms-of-service'
+ termsOfServiceAgree = 'yes'
+ }
+}
+
+/*
+ * kotlinx-coroutines-core dependency leaks into test runtime classpath via kotlin-compiler-embeddable
+ * and conflicts with our own test/runtime incompatibilities (e.g. when class is moved from a main to test),
+ * so we do substitution here
+ */
+allprojects { subProject ->
+ subProject
+ .configurations
+ .matching {
+ // Excluding substituted project itself because of circular dependencies, but still do it
+ // for "*Test*" configurations
+ subProject.name != "kotlinx-coroutines-core" || it.name.contains("Test")
+ }
+ .configureEach { conf ->
+ conf.resolutionStrategy.dependencySubstitution {
+ substitute(module("org.jetbrains.kotlinx:kotlinx-coroutines-core"))
+ .using(project(":kotlinx-coroutines-core"))
+ .because("Because Kotlin compiler embeddable leaks coroutines into the runtime classpath, " +
+ "triggering all sort of incompatible class changes errors")
+ }
+ }
+}