Gradle 覆盖默认检查任务

Gradle override the default check task

我将我的 sourceSets 定义为

sourceSets {
    // Configuring SourceSets for all connector source files.
    main {
        java {
            srcDirs = ['src']
        }
    }
    test {
        // integrationTests
    }
    unitTests {
        //unitTests
    }
}

test {
   // integrationTests
}

task('unitTest', type: Test) {
  //unitTests
}

当我开始 ./gradlew build 时,check 任务基本上调用 test 目标。

我可以覆盖默认 gradle build 任务的 'check' 机制来调用 unitTest 而不是 test 吗?

首先,请考虑仅使用任务 test 进行单元测试,并使用另一个源集进行集成测试。 Gradle 及其插件遵循一种称为 约定优于配置 的方法,Java 插件的约定是使用任务 test 进行单元测试。


要真正回答您的问题,您可以使用 getDependsOn() and setDependsOn​(Iterable<?>) 访问和修改每个任务的依赖关系,因此您的问题的简单解决方案可能是以下代码:

check {
    dependsOn.clear()
    dependsOn unitTest
}

这将从任务 check 中删除所有任务依赖性,然后添加对任务 unitTest 的依赖性。但是,这可能会导致新的问题,因为其他插件可能会自动为 check 注册任务依赖项,这些依赖项也将被删除。

上述代码的一个明显改进是只删除对 test 任务的依赖,而不是所有任务的依赖。可悲的是,这并不像人们想象的那么简单。您可能已经注意到方法 getDependsOn() returns 是 Set<Object> 而不是 Set<Task>。为了方便起见,任务依赖性不仅可以使用任务来表示,还可以通过传递稍后将解析为任务的其他对象(例如,包含任务名称的字符串)来表示。 current version of the Java plugin uses a Provider<Task> to register the dependency between the task check and the task test. To just remove the dependency on the task test, you would need to iterate over all dependencies in dependsOn and find the one with the type Provider that returns the task test via its get() 方法。然后,您可以从 dependsOn.

中删除 Provider

如您所见,一旦任务依赖项被注册,就可以删除它们,但这并不容易,因此您可能应该遵循惯例并使用任务 test 进行单元测试.