簡體   English   中英

Gradle 設置插件擴展

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM