如果我有一個定義新專案屬性的插件:
// Common plugin
var copyrightDate: String? by project.extra
然后嘗試在構建腳本中訪問此屬性:
plugins {
`lifecycle-base`
id("acme.common")
}
copyrightDate = "2022"
我得到了可預測的結果:
e: path\to\build.gradle.kts:7:1: Unresolved reference: copyrightDate
此處的答案中提到的解決方法是每次要使用它時再次顯式宣告該屬性,例如:
var copyrightDate: String? by project.extra
由于我們有許多專案使用相同的插件,我寧愿讓這種情況自動發生,例如應用 java 插件如何使java {}函式可用而無需宣告它。這種機制似乎被許多插件使用,包括那些不隨 Gradle 提供的插件。但我還沒有弄清楚他們是如何讓它發揮作用的。
這是怎么做的?
- 測驗專案包含一個為 Gradle TestKit 撰寫的單元測驗,它嘗試運行類似的構建腳本。
uj5u.com熱心網友回復:
注冊一個擴展
這樣做的官方方法是注冊一個擴展。
首先創建一個擴展物件。只要它只有簡單的屬性,它就可以是Gradle 托管型別。
// src/main/kotlin/my/custom/plugin/MyCustomPluginSettings.kt
package my.custom.plugin
import org.gradle.api.provider.Property
interface MyCustomPluginSettings {
val copyrightDate: Property<String>
}
(我使用的是 aProperty<>而不是 a (這里String列出了好處),但如果你愿意,你也可以使用普通的。)String
接下來,在您的插件中,創建擴展,并為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")
}
}
請注意,我使用的是 Gradle Kotlin DSL。確保在您的插件中應用該kotlin-dsl插件build.gradle.kts!
您也可以MyCustomPluginSettings以相同的方式在 buildSrc 插件中應用您的插件 - 只需使用檔案中apply(...) {}函式的內容.kts。
現在,當您應用插件時,Gradle 將根據您為擴展提供的名稱自動生成Kotlin DSL 訪問器。
// 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源根目錄(不帶包)或默認匯入包之一(如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") }輔助函式)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/503839.html
標籤:毕业典礼 毕业插件 gradle-kotlin-dsl
上一篇:JDBI和Kotlin映射
