注册扩展
官方的做法是
register an extension
.
首先创建一个扩展对象。只要它只有简单的属性,它就可以是
Gradle managed type
.
// src/main/kotlin/my/custom/plugin/MyCustomPluginSettings.kt
package my.custom.plugin
import org.gradle.api.provider.Property
interface MyCustomPluginSettings {
val copyrightDate: Property<String>
}
(我用过
Property<>
而不是
String
(列出了好处
here
)但你也可以用平原
一串
如果你愿意的话。)
接下来,在您的插件中,创建扩展,并为设置默认值
copyrightDate
.
// src/main/kotlin/my/custom/plugin/MyCustomPlugin.kt
package my.custom.plugin
import org.gradle.api.*
import org.gradle.kotlin.dsl.*
abstract class MyCustomPlugin : Plugin<Project> {
override fun apply(target: Project) {
val myCustomPluginSettings = target.extensions.create<MyCustomPluginSettings>("myCustomPlugin")
myCustomPluginSettings.copyrightDate.convention("2022")
}
}
请注意,我使用的是GradleKotlin DSL。确保申请
the
kotlin-dsl
plugin
在您的插件中
build.gradle.kts
!
您也可以应用
MyCustomPluginSettings
以同样的方式在buildSrc插件中-只需使用
apply(...) {}
中的函数
.kts
文件
现在,当您应用插件时,Gradle将自动生成
Kotlin DSL accessor
根据您提供的扩展名。
// build.gradle.kts
plugins {
id("my.custom.plugin")
}
println(myCustomPlugin.copyrightDate.get())
非扩展方法
如果在中定义属性
.kt
文件,那么只要该文件包含在插件中。
(如果您正在编写buildSrc插件,那么
.kt
文件可以在中的任何位置
./buildSrc/src/main/kotlin/...
)
// src/main/kotlin/my/custom/plugin/constants.kt
package my.custom.plugin
import org.gradle.api.Project
var Project.copyrightDate: String?
get() = extra["copyrightDate"] as String?
set(value) {
extra["copyrightDate"] = value
}
现在在一个
build.gradle.kts
使用可以导入此。
// build.gradle.kts
import my.custom.plugin.copyrightDate
plugins {
id("my.custom.plugin")
}
println(copyrightDate)
避免导入
您可以通过以下方式避免导入:
constants.kt
在源根目录中,不带包,或者在
default import packages
喜欢
org.gradle.kotlin.dsl
.
// src/main/kotlin/my/custom/plugin/constants.kt
package org.gradle.kotlin.dsl
import org.gradle.api.Project
var Project.copyrightDate: String?
get() = extra["copyrightDate"] as String?
set(value) {
extra["copyrightDate"] = value
}
由于存在冲突的风险,我只建议buildSrc插件使用此方法。但是,如果您想为更复杂的东西包括一个助手扩展,比如一个用默认版本定义依赖关系的助手函数(比如
dependencies { kotlin("reflect") }
助手功能)。