Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gradle.pdf
Скачиваний:
9
Добавлен:
24.03.2015
Размер:
1.4 Mб
Скачать

Example 17.11. Configuring a task - with configure() method

build.gradle

task myCopy(type: Copy)

myCopy.configure { from('source') into('target')

include('**/*.txt', '**/*.xml', '**/*.properties')

}

Every task has a configure() method, which you can pass a closure for configuring the task. Gradle uses this style for configuring objects in many places, not just for tasks.

You can also use a configuration closure when you define a task.

Example 17.12. Defining a task with closure

build.gradle

task copy(type: Copy) { from 'resources' into 'target'

include('**/*.txt', '**/*.xml', '**/*.properties')

}

17.4. Adding dependencies to a task

There are several ways you can define the dependencies of a task. In Section 6.5, “Tas dependencies” you were introduced to defining dependencies using task names. Task names can refer to tasks in the same project as the task, or to tasks in other projects. To refer to a task in another project, you prefix the name of the task with the path of the project it belongs to. Below is an example which adds a dependency from projectA:taskX to projectB:taskY:

Page 90 of 343

Example 17.13. Adding dependency on task from another project

build.gradle

project('projectA') {

task taskX(dependsOn: ':projectB:taskY') << { println 'taskX'

}

}

project('projectB') { task taskY << {

println 'taskY'

}

}

Output of gradle -q taskX

> gradle -q taskX taskY

taskX

Instead of using a task name, you can define a dependency using a Task object, as shown in this example:

Example 17.14. Adding dependency using task object

build.gradle

task taskX << { println 'taskX'

}

task taskY << { println 'taskY'

}

taskX.dependsOn taskY

Output of gradle -q taskX

> gradle -q taskX taskY

taskX

For more advanced uses, you can define a task dependency using a closure. When evaluated, the closure is passed the task whose dependencies are being calculated. The closure should return a single Task or collection of Task objects, which are then treated as dependencies of the task. The following example adds a dependency from taskX to all the tasks in the project whose name starts with lib:

Page 91 of 343

Example 17.15. Adding dependency using closure

build.gradle

task taskX << { println 'taskX'

}

taskX.dependsOn {

tasks.findAll { task -> task.name.startsWith('lib') }

}

task lib1 << { println 'lib1'

}

task lib2 << { println 'lib2'

}

task notALib << { println 'notALib'

}

Output of gradle -q taskX

> gradle -q taskX lib1

lib2 taskX

For more information about task dependencies, see the Task API.

17.5. Adding a description to a task

You can add a description to your task. This description is for example displayed when executing g

.

Example 17.16. Adding a description to a task

build.gradle

task copy(type: Copy) {

description = 'Copies the resource directory to the target directory.' from 'resources'

into 'target'

include('**/*.txt', '**/*.xml', '**/*.properties')

}

17.6. Replacing tasks

Sometimes you want to replace a task. For example if you want to exchange a task added by the Java plugin with a custom task of a different type. You can achieve this with:

Page 92 of 343

Example 17.17. Overwriting a task

build.gradle

task copy(type: Copy)

task copy(overwrite: true) << { println('I am the new one.')

}

Output of gradle -q copy

> gradle -q copy I am the new one.

Here we replace a task of type Copy with a simple task. When creating the simple task, you have to set the overwrite property to true. Otherwise Gradle throws an exception, saying that a task with such a name already exists.

17.7. Skipping tasks

Gradle offers multiple ways to skip the execution of a task.

17.7.1. Using a predicate

You can use the onlyIf() method to attach a predicate to a task. The task's actions are onl executed if the predicate evaluates to true. You implement the predicate as a closure. The closure is passed the task as a parameter, and should return true if the task should execute and false if the task should be skipped. The predicate is evaluated just before the task is due to be executed.

Example 17.18. Skipping a task using a predicate

build.gradle

task hello << {

println 'hello world'

}

hello.onlyIf { !project.hasProperty('skipHello') }

Output of gradle hello -PskipHello

> gradle hello -PskipHello :hello SKIPPED

BUILD SUCCESSFUL

Total time: 1 secs

Page 93 of 343

17.7.2. Using StopExecutionException

If the rules for skipping a task can't be expressed with predicate, you can use the StopExecutionException. If this exception is thrown by an action, the further execution of this action as well as the execution of any following action of this task is skipped. The build continues with executing the next task.

Example 17.19. Skipping tasks with 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 a

if (true) {

throw new StopExecutionException() }

}

task myTask(dependsOn: 'compile') << { println 'I am not affected'

}

Output of gradle -q myTask

> gradle -q myTask I am not affected

This feature is helpful if you work with tasks provided by Gradle. It allows you to add conditional execution of the built-in actions of such a task. [7]

17.7.3. Enabling and disabling tasks

Every task has also an enabled flag which defaults to true. Setting it to false prevents the execution of any of the task's actions.

Example 17.20. Enabling and disabling tasks

build.gradle

task disableMe << {

println 'This should not be printed if the task is disabled.'

}

disableMe.enabled = false

Output of gradle disableMe

> gradle disableMe :disableMe SKIPPED

BUILD SUCCESSFUL

Total time: 1 secs

Page 94 of 343

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]