在 Gradle 插件中使用 Gradle Property 类型与仅使用 String 类型相比有什么好处?

问题描述 投票:0回答:1
  1. 在 Gradle 插件中,我可以将属性定义为:
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类型。

java android kotlin gradle gradle-plugin
1个回答
0
投票

据我所知,属性的主要好处是延迟配置(如果使用正确)。它们还允许您定义传统值,甚至基于其他提供商。约定值也可以延迟计算。还有

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"
}
© www.soinside.com 2019 - 2024. All rights reserved.