如何访问子项目的build.gradle.kts中定义在根项目的build.gradle.kts中的函数

问题描述 投票:0回答:1

我有一个使用 Kotli DSL 的基于 gradle 的项目。层次结构如下。

根项目 --> 子项目

根项目的 build.gradle.kts 文件中定义了一个函数。

fun printHello() { println("Hello") }

我想在子项目的build.gradle.kts文件中访问这个函数。我尝试调用该函数,但它显示未解析的引用 printHello。

虽然这是在 gradle 文档中在 动态方法 子标题下给出的 https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html *

一个项目有 5 个方法“范围”,它会在其中搜索方法:

  • 父项目的方法,递归到根项目。*

我怎样才能达到同样的效果?

我尝试在根项目的 build.gradle.kts 中创建一个函数,并在子项目的 build.gradle.kts 文件中调用它,但它说未解析的引用 printHello。

spring-boot gradle gradle-kotlin-dsl gradlew dynamicmethod
1个回答
0
投票

您链接的文档是根据 Groovy 构建脚本编写的。使用 Kotlin DSL 时的方法有点不同,因为 Kotlin 是一种静态类型语言,因此编译器必须知道在编译时定义了哪些函数。

使用 Kotlin DSL 访问父

build.gradle.kts
文件中定义的函数的类似方法是(请参阅部分文档):

// In root build.gradle.kts

// Option 1: Double braces as the return value of the outer lambda gives the property value
val printHello by extra { { println("Hello") } }

// Option 2
extra["printHello"] = { println("Hello") }

// In child build.gradle.kts

// Option 1
val printHello: () -> Unit by project
printHello()

// Option 2
(rootProject.extra["printHello"] as () -> Unit)()

但是,这些都不是类型安全的,因此我建议编写一个 预编译脚本插件 或在

src/main/kotlin
buildSrc
文件夹中编写一个函数,并应用 Kotlin 插件来共享代码片段项目之间的代码。

© www.soinside.com 2019 - 2024. All rights reserved.