【问题标题】:How to express a project dependency in a Gradle plugin?如何在 Gradle 插件中表达项目依赖关系?
【发布时间】:2020-11-14 00:31:05
【问题描述】:

我正在写一个 Gradle 插件,我想在其他项目上添加一些依赖项。如何在插件代码中表达?

对于正常的依赖,它是project.dependencies.add("implementation", "my.dependency.name")

在 Gradle Kotlin DSL 中,我会这样做

    implementation(kotlin("stdlib-jdk8"))
    implementation(project(":myproject"))

如何在我的插件中表达这两个?

【问题讨论】:

    标签: kotlin gradle plugins gradle-plugin


    【解决方案1】:

    从Gradle Build Language Reference 文档中我们可以看到:

    一些基础知识

    您应该了解一些基本概念,这将有助于您编写 Gradle 脚本。

    首先,Gradle 脚本是配置脚本。当脚本执行时,它会配置一个特定类型的对象。 例如,当构建脚本执行时,它会配置一个类型为 Project 的对象 [强调添加]。这个对象被称为脚本的委托对象。 [...]

    这告诉我们,当您在构建脚本中使用project(":myproject") 时,您实际上是在调用Project#project(String)。考虑到这一点,您应该能够在插件实现中简单地使用相同的方法:

    project.dependencies.add("implementation", project.project(":myproject"))
    

    kotlin("stdlib-jdk8") 稍微复杂一些,但也不复杂。当您使用该“语法”时,您实际上是在调用 DependencyHandler.kotlin 扩展函数。当您调用 project.dependencies 时,您将获得一个 DependencyHandler 实例。但是,要使该扩展功能可用于您的插件代码,您需要将 Kotlin DSL API 添加到您的 插件的 依赖项中。 Kotlin DSL Plugin 使这更容易:

    plugins {
        `kotlin-dsl`
    }
    
    repositories {
        jcenter()
    }
    

    总而言之,您的插件代码可能类似于:

    import org.gradle.api.Plugin
    import org.gradle.api.Project
    import org.gradle.kotlin.dsl.kotlin
    
    class FooPlugin : Plugin<Project> {
    
        override fun apply(target: Project) {
            // Apply plugin which adds "implementation" configuration?
            target.dependencies.apply {
                add("implementation", target.project(":myproject"))
                add("implementation", kotlin("stdlib-jdk8"))
            }
        }
    }
    

    【讨论】:

    • 我不得不将插件调用更改为id("org.gradle.kotlin.kotlin-dsl") version "1.3.6",但后来它起作用了。再次感谢!
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多