[英]Gradle Settings plugin extension
我想創建一個設置插件(不是項目插件)來簡化一些東西,但我無法讓配置子句起作用。
這是我的插件(Java 代碼)
public class SettingsPlugin implements Plugin<Settings> {
@Override
public void apply(Settings target) {
target.getExtensions()
.create("modules", IncludeModulesExtension.class, target);
System.err.println("Applied settings plugin");
}
}
public class IncludeModulesExtension {
private final Settings _settings;
public IncludeModulesExtension(Settings settings) {
_settings = settings;
}
public void include(String path) {
}
}
我的問題是,gradle 沒有在我的 settings.gradle.kts 中選擇“模塊”動態 function:
pluginManagement {
...
}
plugins {
id("com.ieffects.gradle-tools.settings-server") version ("7.0.23-SNAPSHOT")
}
modules {
}
我省略了pluginManagement,找到並應用了插件,但是沒有拾取“模塊”。 我做錯了什么?
Starting Gradle Daemon...
Gradle Daemon started in 2 s 396 ms
Applied settings plugin
e: /Volumes/Development/Git/server-framework-galcon/settings.gradle.kts:22:1: Unresolved reference: modules
FAILURE: Build failed with an exception.
* Where:
Settings file '/Volumes/Development/Git/server-framework-galcon/settings.gradle.kts' line: 22
* What went wrong:
Script compilation error:
Line 22: modules {
^ Unresolved reference: modules
1 error
我在實現一個類似的插件時遇到了同樣的問題,雖然我沒有找到原因,但我確實設法解決了這個問題:
// SettingsExtensions.kt
import org.gradle.api.Action
import org.gradle.api.initialization.Settings
import org.gradle.api.plugins.ExtensionAware
/* WORKAROUND: for some reason a type-safe accessor is not generated for the extension,
* even though it is present in the extension container where the plugin is applied.
* This seems to work fine, and the extension methods are only available when the plugin
* is actually applied. */
/**
* Retrieves the [modules][IncludeModulesExtension]
* extension.
*/
val Settings.modules: IncludeModulesExtension
get() =
(this as ExtensionAware).extensions.getByName("modules") as IncludeModulesExtension
/**
* Configures the [modules][IncludeModulesExtension] extension.
*/
fun Settings.modules(configure: Action<IncludeModulesExtension>): Unit =
(this as ExtensionAware).extensions.configure("modules",
configure)
正如評論所解釋的,它的行為與生成的類型安全訪問器完全相同(相同的語法和擴展僅在實際應用插件時可用)。
我沒有測試它是否適用於 Groovy DSL,但由於擴展方法在語法上與生成的訪問器相同,我認為它可以。
或者,如果您在應用插件的設置腳本中執行此操作,而不是modules
DSL,則可以這樣做:
configure<IncludeModulesExtension> {
...
}
這也有效,因為即使沒有生成類型安全的訪問器,擴展也會正確初始化並添加到擴展容器中。 但是DSL顯然更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.