【问题标题】:How to have many configurations of a task in gradle builds?如何在 gradle 构建中对任务进行多种配置?
【发布时间】:2020-08-12 14:45:42
【问题描述】:

我目前正在使用插件对 Java 代码运行基准测试,我使用 jmh-gradle-plugin 来执行此操作。

该插件允许使用 jmh 代码块方便地描述 JMH 配置:

jmh {
    include = ["List"]
    benchmarkParameters=["seed": ["1", "2", "3", "4", "5"],
        "applicationSize":["100", "1000"],
        "baseStructureSize":["100", "1000"]]
    fork=2
    timeOnIteration="250ms"
    iterations=2
    warmup="250ms"
    warmupIterations=2
    fork=2
    resultFormat="CSV"
    benchmarkMode=["ss"]
    timeUnit="ms"
    failOnError = true
}

这很有用,但我希望有不同类型的相同任务,例如,一种输出为 CSV,一种输出为 JSON。我知道这可以使用resultFormat=<format> 进行配置,但我找不到“复制”任务并为每个变体提供不同配置的方法。

Gradle documentation has a page 关于配置任务,但是他们配置了一个Copy 任务。我想我可以按照类似的方法写:

task myJMH(type: me.champeau.gradle.JMHTask) {
    resultFormat="JSON"
}

但是方法不起作用,正如我在this issue 中提到的那样。我认为这可能是 JMH 的任务不同。注册一个具有该名称的类是可行的,但无法配置它。我收到以下错误:

Could not set unknown property 'include' for task ':myJMH' of type me.champeau.gradle.JMHTask.

同样,我想要shadowJar 任务的各种配置,以便能够生成任务的多个不同变体,但我遇到了同样的问题。

【问题讨论】:

    标签: java gradle build jmh


    【解决方案1】:

    第一个示例中的jmh 不是任务,而是扩展。该插件注册了一个扩展名和一个同名的任务。实际上,这是 Gradle 插件的流行模式。

    通常,即使插件创建的任务可以使用扩展配置,仍然可以直接配置它们,因为它们仍然提供配置属性。任务类型ShadowJar就是这种情况,所以可以simply create tasks of that type manually

    // Shadowing Test Sources and Dependencies
    import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
    
    task testJar(type: ShadowJar) {
        classifier = 'tests'
        from sourceSets.test.output
        configurations = [project.configurations.testRuntime]
    }
    
    

    遗憾的是,任务类型 JMHTask 的实现方式只是从扩展中检索配置,因此任何实例都将使用相同的配置。

    但是,您可以尝试以下解决方法:

    创建配置扩展的任务,然后将它们与jmh 任务一起执行:

    jmh {
        include = ["List"]
        benchmarkParameters=["seed": ["1", "2", "3", "4", "5"],
            "applicationSize":["100", "1000"],
            "baseStructureSize":["100", "1000"]]
        fork=2
        timeOnIteration="250ms"
        iterations=2
        warmup="250ms"
        warmupIterations=2
        fork=2
        benchmarkMode=["ss"]
        timeUnit="ms"
        failOnError = true
    }
    
    task jmhCsv {
        doFirst {
            jmh.resultFormat="CSV"
        }
        finalizedBy 'jmh'
    }
    
    task jmhJson {
        doFirst {
            jmh.resultFormat="JSON"
        }
        finalizedBy 'jmh'
    }
    

    请注意,一个任务只能在构建中执行一次,因此如果您想在同一运行中运行不同的配置,此解决方法将不起作用。

    【讨论】:

      猜你喜欢
      • 2020-05-20
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多