open class ExamplePluginExtension {
var exampleName: String? = null
}
并在 build.gradle.kts 中访问它,如下所示:
example {
exampleName = "Lorem Ipsum"
}
或者2.我可以使用Gradle的Property类型(org.gradle.api.provider.Property):
open class ExamplePluginExtension @Inject constructor(objectFactory: ObjectFactory) {
val exampleName: Property<String> = objectFactory.property(String::class.java)
}
在 build.gradle.kts 中访问它,如下所示:
example {
exampleName.set("Lorem Ipsum")
}
Gradle 文档提倡在 Gradle 插件中使用 Property 类型,但为什么呢?使用 Property 类型非常麻烦,会创建大量样板文件并禁止使用可为 null 的属性。我看到很多第三方库比如Flyway都使用第一个选项,完全忽略了Property类型。
据我所知,属性的主要好处是延迟配置(如果使用正确)。它们还允许您定义传统值,甚至基于其他提供商。约定值也可以延迟计算。还有
Property
提供的 API 的好处。请注意,还有更专业的属性类型,例如 ListProperty
和 DirectoryProperty
,它们添加了更多方法。
使用属性并没有那么冗长。您正在注入对象工厂并手动创建属性。但你可以让 Gradle 装饰类并直接注入属性(任务类也可以这样做)。它可能看起来像:
import org.gradle.api.provider.Property
abstract class ExamplePluginExtension {
abstract val exampleName: Property<String>
init {
// There's an overload that accepts a Provider. Note it might
// be better to do this in the plugin class after creating the
// extension, not sure).
exampleName.convention("default name")
}
}
或者作为界面:
import org.gradle.api.provider.Property
interface ExamplePluginExtension {
// If you want to set the conventional value, then you'd have to set it
// somewhere else (e.g., in the plugin class after creating the extension).
val exampleName: Property<String>
}
然后您需要注册扩展程序:
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.*
class ExamplePlugin : Plugin<Project> {
override fun apply(project: Project) {
// this returns an instance of the extension class
project.extensions.create("example", ExamplePluginExtension::class)
}
}
这可以让您在构建文件中执行以下操作:
plugins {
// apply example plugin
}
example {
exampleName = "Foo"
}