首页 > 解决方案 > Gradle 覆盖默认检查任务

问题描述

我已将我的 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任务的“检查”机制来调用unitTest这里而不是test

标签: javaunit-testinggradlebuild

解决方案


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


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

check {
    dependsOn.clear()
    dependsOn unitTest
}

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

对上面代码的一个明显改进是只删除对test任务的依赖,而不是所有的任务依赖。可悲的是,这并不像人们想象的那么简单。您可能已经注意到该方法getDependsOn()返回 aSet<Object>而不是 a Set<Task>。为方便起见,任务依赖关系不仅可以使用任务来表达,还可以通过传递稍后将解析为任务的其他对象(例如,包含任务名称的字符串)来表达。当前版本的 Java 插件使用 a来注册 task和 taskProvider<Task>之间的依赖关系。要删除对任务的依赖项,您需要遍历所有依赖项并找到具有返回任务类型的依赖项checktesttestdependsOnProvidertest通过它的get()方法。然后,您可以将其ProviderdependsOn.

如您所见,一旦注册了任务依赖项,就可以删除它们,但这并不容易,因此您可能应该遵循约定并将任务test用于单元测试。


推荐阅读