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

时间:2015-05-28 16:30:14

标签: 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
    }
}

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

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'
}

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

1 个答案:

答案 0 :(得分:7)

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

task nightly(dependsOn: 'build')

test {
    useJUnit()

    gradle.taskGraph.whenReady {
        if (gradle.taskGraph.hasTask(":${project.name}:nightly")) {
            options {
                includeCategories 'nightly'
            }
        }
    }
}