如何配置Gradle Tooling API构建依赖模型前先执行buildscript自定义任务
解决方案
你可以通过以下两种方式解决该问题,均不会在配置阶段执行耗时的依赖计算逻辑:
方案1:适配IntelliJ Tooling API专属配置
通过IDEA官方提供的同步前执行指定任务的配置,直接在原有脚本中添加以下代码即可:
plugins { `java-library` idea } // 原有配置保持不变 repositories { mavenCentral() } val setupDeps = tasks.register("setupDeps") { doLast { dependencies.add("implementation", "org.clojure:clojure:1.10.3") } } tasks.named("compileJava") { dependsOn(setupDeps) } // 新增IDEA同步配置 idea { project { beforeSync { dependsOn(setupDeps) } } } // 兼容新版IntelliJ的补充配置 gradle.taskGraph.whenReady { if (System.getProperty("idea.active") == "true" && gradle.startParameter.taskNames.isEmpty()) { setupDeps.get().actions.forEach { action -> action.execute(setupDeps.get()) } } }
该方案仅针对IntelliJ环境生效,无需修改原有任务逻辑。
方案2:使用Gradle原生懒加载依赖(推荐)
通过自定义任务输出作为依赖源的方式,Gradle会自动管理任务依赖关系,不管是命令行执行还是Tooling API拉取依赖模型,都会自动触发setupDeps任务,不需要额外适配任何工具链:
plugins { `java-library` } repositories { mavenCentral() } // 自定义任务封装依赖计算逻辑 abstract class SetupDepsTask : DefaultTask() { @get:OutputFile val depFile = project.objects.fileProperty().convention(project.layout.buildDirectory.file("generated-dependencies.txt")) @TaskAction fun computeDependencies() { // 此处放置你原本耗时的依赖计算逻辑 val calculatedDep = "org.clojure:clojure:1.10.3" depFile.get().asFile.writeText(calculatedDep) } } val setupDeps = tasks.register<SetupDepsTask>("setupDeps") // 直接将任务输出作为依赖项,Gradle自动触发任务执行 dependencies { implementation(setupDeps.map { task -> task.depFile.get().asFile.readText() }) }
该方案是Gradle官方推荐的最佳实践,兼容性更强,所有使用Tooling API的场景都可以正常生效,也不需要手动给compileJava配置依赖关系,Gradle会自动处理。
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

