如何使用Kotlin DSL在自定义Gradle插件任务中动态添加依赖与仓库
问题根因
你当前代码无法生效的核心原因是生命周期错配:Gradle 依赖解析发生在配置阶段,而你将依赖添加逻辑放在了任务的doLast回调中,doLast属于执行阶段的逻辑,运行时依赖解析已经完成,新增的依赖不会被识别。
修复实现
不需要绑定任务执行逻辑,直接在插件apply方法中通过afterEvaluate块读取扩展配置后添加依赖即可,该回调会在项目配置完成后触发,能正常拿到用户自定义的扩展值:
class SpigotVersioner: Plugin<Project> { override fun apply(project: Project) { println("Latest spigot version: ${WebScraper.getLatestVersion()}") val extension = project.extensions.create("spigot", SpigotExtension::class.java) extension.apiVersion.set("latest") extension.bukkitVersion.set("latest") // 自动添加Spigot公共仓库(可选扩展功能) project.repositories { maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } mavenCentral() } // 项目配置完成后读取扩展值,添加依赖 project.afterEvaluate { val apiVersion = extension.apiVersion.get() val dependency = deriveDependencyStr(apiVersion) // 写法1:Kotlin DSL 风格 project.dependencies { "compileOnly"(dependency) } // 写法2:通用add方法,参数说明: // 第一个参数:依赖配置名,比如compileOnly/implementation/api // 第二个参数:依赖坐标,支持字符串、Project、本地文件等格式 // project.dependencies.add("compileOnly", dependency) } // 保留原有任务(如果不需要手动触发可以删除) project.task("compileSpigotAPI") { it.group = "spigot" it.description = "Adds the spigot api implementation to the project." } } }
注意事项
如果你确实需要实现「手动执行任务才添加依赖」的逻辑,需要额外处理依赖重新解析逻辑,常规Gradle插件都推荐配置阶段自动添加依赖,更符合使用习惯。
内容的提问来源于stack exchange,提问作者neph
相关产品推荐
相关产品推荐

