如何在gradle构建中具有任务的许多配置?

问题描述

我目前正在使用一个插件在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任务进行各种配置,以便能够生成该任务的几种不同变体,但是我遇到了同样的问题。

解决方法

第一个示例中的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'
}

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...