根据要执行的任务配置Gradle任务

Chr*_*ieb 3 gradle

我好像有点鸡蛋问题.我有Gradle用Java插件定义的测试任务.我将JUnit类别设置为使用属性运行.我的团队已表示对将在特定类别中运行任务而不必使用-P在命令行上设置属性的任务感兴趣.

我无法想出一种方法来解决这个问题,因为新test任务只有在执行任务时才需要配置任务.由于要运行的类别需要是测试任务的输入参数,以确保UP-TO-DATE检查功能正常,因此需要在配置阶段设置它们,并且不能等待执行阶段.

有谁知道如何进行像这样的设置?也许我正在从错误的角度接近它.

编辑1

当前的build.gradle

apply plugin: 'java'

def defaultCategory = 'checkin'

test {
    def category = (project.hasProperty('category') ? project['category'] : defaultCategory)
    inputs.property('category', category)

    useJUnit()
    options {
        includeCategories category
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要什么,但不起作用:

apply plugin: 'java'

def defaultCategory = 'checkin'

test {
    def category = (project.hasProperty('category') ? project['category'] : defaultCategory)
    inputs.property('category', category)

    useJUnit()
    options {
        includeCategories category
    }
}

task nightly(dependsOn: 'build') {
    defaultCategory = 'nightly'
}

task weekly(dependsOn: 'build') {
    defaultCategory = 'weekly'
}
Run Code Online (Sandbox Code Playgroud)

由于两个任务都是配置的,无论它们是否会运行,它们都变得无用.我无法在执行阶段之前推迟设置defaultCategory值,因为需要配置任务的任务输入test值,并且因为该值需要能够运行在test任务之前运行的build任务.

Chr*_*ieb 7

我不知道我是否称这种解决方案优雅,但事实证明它是有效的:

task nightly(dependsOn: 'build')

test {
    useJUnit()

    gradle.taskGraph.whenReady {
        if (gradle.taskGraph.hasTask(":${project.name}:nightly")) {
            options {
                includeCategories 'nightly'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @RomanNikitchenko 在这里工作得很好。我只是省略了 `:${project.name}`,因为我没有多模块构建。 (2认同)