You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:51:03