It is very important to understand the distinction between task configuration and task execution:
task eclipsify {
// Code that goes here is *configuring* the task, and will
// get evaluated on *every* build invocation, no matter
// which tasks Gradle eventually decides to execute.
// Don't do anything time-consuming here.
doLast {
// `doLast` adds a so-called *task action* to the task.
// The code inside the task action(s) defines the task's behavior.
// It will only get evaluated if and when Gradle decides to
// execute the task.
exec { commandLine = ["./play1.3.x/play", "eclipsify"] }
}
}
// Improving on the previous task declaration, let's now use a *task type*
// (see `type: Exec` below). Task types come with a predefined task action,
// so it's typically not necessary to add one yourself. Also, many task types
// predefine task inputs and outputs, which allows Gradle to check if the task
// is up-to-date. Another advantage of task types is that they allow for
// better tooling support (e.g. auto-completion of task properties).
task precompile(type: Exec) {
// Since this task already has a task action, we only
// need to configure it.
commandLine = ["./play1.3.x/play", "precompile"] }
}
If you don't get configuration vs. execution right, you'll see symptoms such as very long startup times and tasks seemingly getting executed when they shouldn't.
To learn which task types are available and how to configure them, check out the Gradle Build Language Reference. Besides, there is an ever-growing list of third-party plugins and task types.
PS: I changed the task names and removed the overwrite: True
(which should only be used as a last resort) to not distract from the main message of my answer.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…