【问题标题】:Gradle override the default check taskGradle 覆盖默认检查任务
【发布时间】:2021-03-18 17:26:00
【问题描述】:

我已将我的 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

【问题讨论】:

  • 以下 Lukas 出色答案的替代解决方案(特别是如果您无法更改源集)是引入您自己的构建任务,这取决于您想要什么,例如 unitTestassemble。你可以称它为quickBuild 或类似名称。

标签: java unit-testing gradle build


【解决方案1】:

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


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

check {
    dependsOn.clear()
    dependsOn unitTest
}

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

对上面代码的一个明显改进是删除对test 任务的依赖,而不是所有任务依赖。可悲的是,这并不像人们想象的那么简单。您可能已经注意到 getDependsOn() 方法返回的是 Set<Object> 而不是 Set<Task>。为方便起见,任务依赖关系不仅可以使用任务来表达,还可以通过传递稍后将解析为任务的其他对象来表达(例如,包含任务名称的字符串)。 current version of the Java plugin 使用Provider<Task> 来注册任务check 和任务test 之间的依赖关系。要删除对任务test 的依赖,您需要遍历dependsOn 中的所有依赖,并通过get() 方法找到类型为Provider 并返回任务test 的依赖。然后,您可以从 dependsOn 中删除 Provider

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

【讨论】:

  • 同意你的第一点@lukas-körfer 并感谢你解释得很好的答案。
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 2011-12-28
  • 2014-10-04
  • 2016-09-16
  • 2015-06-30
  • 1970-01-01
  • 2020-11-21
  • 2014-07-21
相关资源
最近更新 更多