From 01b6af452f6a8d22db80e53638dc2299981d4bed Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Wed, 3 May 2023 14:37:35 +0200 Subject: [PATCH] Build: Introduce `resolveDependencies` task It is used on the build server to pre-download all dependencies and check that verification-metadata.xml is up-to-date #KTI-72 --- build.gradle.kts | 11 ++-- gradle/resolveDependencies.gradle.kts | 76 +++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 gradle/resolveDependencies.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index 42443c8d67e..ba20e42547e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -95,6 +95,7 @@ rootProject.apply { from(rootProject.file("gradle/retryPublishing.gradle.kts")) from(rootProject.file("gradle/modularizedTestConfigurations.gradle.kts")) from(rootProject.file("gradle/ideaRtHack.gradle.kts")) + from(rootProject.file("gradle/resolveDependencies.gradle.kts")) } IdeVersionConfigurator.setCurrentIde(project) @@ -168,11 +169,11 @@ val firCompilerCoreModules = arrayOf( ).also { extra["firCompilerCoreModules"] = it } val firAllCompilerModules = firCompilerCoreModules + - arrayOf( - ":compiler:fir:raw-fir:light-tree2fir", - ":compiler:fir:analysis-tests", - ":compiler:fir:analysis-tests:legacy-fir-tests" - ) + arrayOf( + ":compiler:fir:raw-fir:light-tree2fir", + ":compiler:fir:analysis-tests", + ":compiler:fir:analysis-tests:legacy-fir-tests" + ) val fe10CompilerModules = arrayOf( ":compiler", diff --git a/gradle/resolveDependencies.gradle.kts b/gradle/resolveDependencies.gradle.kts new file mode 100644 index 00000000000..79e1c91c7b9 --- /dev/null +++ b/gradle/resolveDependencies.gradle.kts @@ -0,0 +1,76 @@ +import java.net.URI +import org.jetbrains.kotlin.gradle.targets.js.d8.D8RootExtension +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnRootExtension +import org.spdx.sbom.gradle.SpdxSbomExtension + + +/* + * When called with `--write-verification-metadata` resolves all build dependencies including implicit dependecies for all platforms and + * dependencies downloaded by plugins. Usefull to populate Gradle dependency cache or update `verification-metadata.xml` properly. + * + * `./gradlew resolveDependencies --write-verification-metadata md5,sha256` + */ +tasks.register("resolveDependencies") { + doFirst { + allprojects { + logger.info("Resolving dependencies in $this") + + // resolve implicit dependencies one by one to avoid conflicts between them + configurations.implicitDependencies.get().allDependencies.forEach { implicitDependency -> + configurations.detachedConfiguration(implicitDependency).resolve() + } + + plugins.withId("java-base") { + val service = project.extensions.getByType() + val javaExtension = extensions.getByType() + service.compilerFor(javaExtension.toolchain).get() + } + + project.extensions.findByType()?.run { + targets.forEach { target -> + target.configurations.get().forEach { configurationName -> + val pomDependencies = project.configurations[configurationName].incoming.resolutionResult.allComponents + .map { it.id } + .filterIsInstance() + .map { project.dependencies.create(it.displayName + "@pom") } + + project.configurations.detachedConfiguration(*pomDependencies.toTypedArray()).resolve() + } + } + } + } + + fun Project.resolveDependencies( + vararg dependency: String, + repositoryHandler: (RepositoryHandler.() -> ArtifactRepository)? = null + ) { + val repo = repositoryHandler?.let { repositories.repositoryHandler() } + dependency.forEach { + configurations.detachedConfiguration(dependencies.create(it)).resolve() + } + repo?.run { repositories.remove(this) } + } + + rootProject.extensions.findByType()?.run { + project.resolveDependencies( + "google.d8:v8:linux64-rel-$version@zip", + "google.d8:v8:win64-rel-$version@zip", + "google.d8:v8:mac-arm64-rel-$version@zip", + "google.d8:v8:mac64-rel-$version@zip" + ) + } + + rootProject.extensions.findByType()?.run { + project.resolveDependencies("com.yarnpkg:yarn:$version@tar.gz") { + ivy { + url = URI(downloadBaseUrl) + patternLayout { + artifact("v[revision]/[artifact](-v[revision]).[ext]") + } + metadataSources { artifact() } + content { includeModule("com.yarnpkg", "yarn") } + } + } + } + } +} \ No newline at end of file