java - 应如何将配置从 Gradle 扩展传递给 Gradle Task?

标签 java gradle groovy build.gradle gradle-plugin

我正在创建一个 Gradle 插件及其对应的对象,以便在 Groovy DSL 中使用。我对差异和扩展以及任务以及如何在两者之间传递配置以及输入和输出注释的位置感到困惑。这是我的任务

abstract public class UrlVerify extends DefaultTask {

    @Input
    abstract public Property<String> getUrl();
    
    @TaskAction
    public void verify() {
        System.out.println(getUrl().get().toString());
    }
}

这是扩展

abstract public class UrlVerifierExtension {

    abstract public Property<String> getUrl();
    abstract public Property<Configuration> getConfiguration();
    abstract public Property<Boolean> getIgnoreFailures();

    public Set<ConflictCategory> getIncludeCategories() {
        return includeCategories;
    }
}

这个插件只接受一个 URL 并验证它。

verification {
    url = 'https://www.moooooereee.com/'
    configuration = configurations.runtimeClasspath
    ignoreFailures = false
}

我有以下插件。我需要手动将 URL 从扩展程序传递到任务,想知道这是否是正确的方法?

public class UrlVerifierPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        project.getPluginManager().apply(JavaLibraryPlugin.class);
        UrlVerifierExtension extension = project.getExtensions().create("verification", UrlVerifierExtension.class);
        UrlVerify verifyUrlTask = project.getTasks().create("verifyUrl", UrlVerify.class);
        verifyUrlTask.getUrl().set(extension.getUrl());
    }

}

除此之外,还不清楚@Input注解是属于扩展的属性还是属于任务?

最佳答案

您似乎非常准确地遵循了 Gradle 文档中的示例。这是配置自定义任务的正确方法。扩展的确切目的是拥有用户提供的设置,然后您的插件会使用这些设置来配置它和任务。

扩展是为用户提供设置。

任务用于在 Gradle 运行时执行操作。

Gradle 使用@Input 注释来确定任务是否需要运行。如果任务之前没有运行过,或者自上次执行以来输入值发生了变化,那么任务将再次运行。

输出声明了运行任务产生的一些结果。一个示例是编译 Java 文件的任务。输出将是编译过程中产生的类文件。如果输出文件被创建它们的任务之外的其他东西修改或删除,那么创建它们的任务已经过时,Gradle 将再次运行它。

此外,一个任务可以将另一个任务的输出声明为它的输入。如果任务 A 创建一些输出文件,而任务 B 使用任务 A 的输出作为输入,则任务 B 将在任务 A 更新或创建其文件时运行。

在您使用 @Input 注释的情况下,我的猜测是在这种情况下您不希望这样做,因为它告诉 Gradle 您的任务只需要运行一次,然后,仅如果用户更新设置。

关于java - 应如何将配置从 Gradle 扩展传递给 Gradle Task?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70661787/

相关文章:

gradle - 如何仅在调试buildtype中注册Transform

Groovy 与 Grape 和 AntBuilder 类加载器问题

java - 无法将文件从 Android 上传到 PHP 服务器

java - 用java编写的浏览器和服务器之间的通信

java - Jackson 用于 Map 的自定义 KeyDeserializer,排除 key 为 null 的条目

android - 无法实例化一个或多个类TextInputEditText内部错误

java - Java 中的 printf() 功能与 CharBuffer 或类似的东西相结合

java - Gradle:路径和 baseDir 都不能为 null 或空字符串

grails - Groovy 中的 sql.rows() 运行缓慢

java - Grails:是什么导致 NameRegistry.getIdFor 中出现 ArrayIndexOutOfBoundsException?