当前位置:K88软件开发文章中心编程工具Gradle → 文章内容

Gradle 任务详述

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-24 10:31:27

。任务排序在许多情况下可能很有用:强制任务顺序执行: 如,'build' 永远不会在 'clean' 前面执行。在构建中尽早进行构建验证:如,验证在开始发布的工作前有一个正确的证书。通过在长久验证前运行快速验证以得到更快的反馈:如,单元测试应在集成测试之前运行。一个任务聚合了某一特定类型的所有任务的结果:如,测试报告任务结合了所有执行的测试任务的输出。 有两种排序规则是可用的:"必须在之后运行"和"应该在之后运行"。通过使用 “ 必须在之后运行”的排序规则,您可以指定 taskB 必须总是运行在 taskA 之后,无论 taskA 和 taskB 这两个任务在什么时候被调度执行。这被表示为 taskB.mustRunAfter(taskA) 。“应该在之后运行”的排序规则与其类似,但没有那么严格,因为它在两种情况下会被忽略。首先是如果使用这一规则引入了一个排序循环。其次,当使用并行执行,并且一个任务的所有依赖项除了任务应该在之后运行之外所有条件已满足,那么这个任务将会运行,不管它的“应该在之后运行”的依赖项是否已经运行了。当倾向于更快的反馈时,会使用“应该在之后运行”的规则,因为这种排序很有帮助但要求不严格。目前使用这些规则仍有可能出现 taskA 执行而 taskB 没有执行,或者 taskB 执行而 taskA 没有执行。添加 '必须在之后运行 ' 的任务排序build.gradle task taskX << { println 'taskX'}task taskY << { println 'taskY'}taskY.mustRunAfter taskX gradle -q taskY taskX 的输出结果 > gradle -q taskY taskXtaskXtaskY 添加 '应该在之后运行 ' 的任务排序build.gradle task taskX << { println 'taskX'}task taskY << { println 'taskY'}taskY.shouldRunAfter taskX gradle -q taskY taskX 的输出结果 > gradle -q taskY taskXtaskXtaskY 在上面的例子中,它仍有可能执行 taskY 而不会导致 taskX 也运行:任务排序并不意味着任务执行gradle -q taskY 的输出结果 > gradle -q taskYtaskY 如果想指定两个任务之间的“必须在之后运行”和“应该在之后运行”排序,可以使用 Task.mustRunAfter() 和 Task.shouldRunAfter() 方法。这些方法接受一个任务实例、 任务名称或 Task.dependsOn()所接受的任何其他输入作为参数。请注意"B.mustRunAfter(A)"或"B.shouldRunAfter(A)"并不意味着这些任务之间的任何执行上的依赖关系:它是可以独立地执行任务 A 和 B 的。排序规则仅在这两项任务计划执行时起作用。当--continue 参数运行时,可能会是 A 执行失败后B执行了。 如之前所述,如果“应该在之后运行”的排序规则引入了排序循环,那么它将会被忽略。当引入循环时,“应该在其之后运行”的任务排序会被忽略build.gradle task taskX << { println 'taskX'}task taskY << { println 'taskY'}task taskZ << { println 'taskZ'}taskX.dependsOn taskYtaskY.dependsOn taskZtaskZ.shouldRunAfter taskX gradle -q taskX 的输出结果 > gradle -q taskXtaskZtaskYtaskX 向任务添加描述你可以向你的任务添加描述。例如,当执行 gradle tasks 时显示这个描述。向任务添加描述build.gradle task copy(type: Copy) { description 'Copies the resource directory to the target directory.' from 'resources' into 'target' include('**/*.txt', '**/*.xml', '**/*.properties')} 替换任务有时您想要替换一个任务。例如,您想要把通过 Java 插件添加的一个任务与不同类型的一个自定义任务进行交换。你可以这样实现:重写任务build.gradle task copy(type: Copy)task copy(overwrite: true) << { println('I am the new one.')} gradle -q copy 的输出结果 > gradle -q copyI am the new one. 在这里我们用一个简单的任务替换 Copy 类型的任务。当创建这个简单的任务时,您必须将 overwrite 属性设置为 true。否则 Gradle 将抛出异常,说这种名称的任务已经存在。跳过任务Gradle 提供多种方式来跳过任务的执行。使用断言你可以使用 onlyIf()方法将断言附加到一项任务中。如果断言结果为 true,才会执行任务的操作。你可以用一个闭包来实现断言。闭包会作为一个参数传给任务,并且任务应该执行时返回 true,或任务应该跳过时返回 false。断言只在任务要执行前才计算。使用断言跳过一个任务build.gradle task hello << { println 'hello world'}hello.onlyIf { !project.hasProperty('skipHello') } gradle hello -PskipHello 的输出结果 > gradle hello -PskipHello:hello SKIPPEDBUILD SUCCESSFULTotal time: 1 secs 使用 StopExecutionException如果跳过任务的规则不能与断言同时表达,您可以使用 StopExecutionException。如果一个操作(action)抛出了此异常,那么这个操作(action)接下来的行为和这个任务的其他 操作(action)都会被跳过。构建会继续执行下一个任务。使用 StopExecutionException 跳过任务build.gradle task compile << { println 'We are doing the compile.'}compile.doFirst { // Here you would put arbitrary conditions in real life. But we use this as an integration test, so we want defined behavior. if (true) { throw new StopExecutionException() }}task myTask(dependsOn: 'compile') << { println 'I am not affected'} gradle -q myTask 的输出结果 > gradle -q myTaskI am not affected 如果您使用由 Gradle 提供的任务,那么此功能将非常有用。它允许您向一个任务的内置操作中添加执行条件。启用和禁用任务每一项任务有一个默认值为 true 的 enabled 标记。将它设置为 false,可以不让这个任务的任何操作执行。启用和禁用任务build.gradle task disableMe << { println 'This should not be printed if the task is disabled.'}disableMe.enabled = false Gradle disableMe 的输出结果 > gradle disableMe:disableMe SKIPPEDBUILD SUCCESSFULTotal time: 1 secs 跳过处于最新状态的任务如果您使用 Gradle 自带的任务,如 Java 插件所添加的任务的话,你可能已经注意到 Gradle 将跳过处于最新状态的任务。这种行在您自己定义的任务上也有效,而不仅仅是内置任务。声明一个任务的输入和输

上一页  [1] [2] [3]  下一页


Gradle 任务详述