Skip to content

Instantly share code, notes, and snippets.

@anthonymonori
Forked from ghale/captureFingerprints.gradle
Last active December 21, 2022 16:26
Show Gist options
  • Save anthonymonori/3ac1f35e1a79d63aee3a5eb2f0315502 to your computer and use it in GitHub Desktop.
Save anthonymonori/3ac1f35e1a79d63aee3a5eb2f0315502 to your computer and use it in GitHub Desktop.
Capture task classpath fingerprints with Gradle Kotlin DSL
// Add into root project, make sure you have Gradle Enterprise plugin
val buildScanApi = project.extensions.findByName("buildScan") as BuildScanExtension
subprojects {
// If you want to limit it to certain module(s), wrap it with: if (name == "module-name") { }
val fingerprinter = serviceOf<org.gradle.internal.fingerprint.classpath.ClasspathFingerprinter>()
tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinCompile::class.java).configureEach task@{
doFirst {
var classLoader: ClassLoader = this@task.javaClass.classLoader
while (classLoader is java.net.URLClassLoader) {
val fingerprints = mutableSetOf<Array<String>>()
val allFiles = mutableSetOf<File>()
classLoader.urLs.forEach {
fingerprints.add(
arrayOf(
"${this@task.path}:${file(it.file).name}",
"${fingerprinter.fingerprint(files(it.file)).hash}"
)
)
allFiles.add(file(it.file))
}
fingerprints.forEach { fingerprint ->
buildScanApi.value(fingerprint[0], fingerprint[1])
}
buildScanApi.value(
"${this@task.path}:classpath",
allFiles.joinToString("\n")
)
classLoader = classLoader.parent
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment