Gradle Exec : Why it is not running in configuration phase?
Asked Answered
L

2

6

Here is my:

build.gradle

task makeDirectoryStructure(type:Exec){

    description 'Creates directory structure .'

    commandLine 'mkdir'
    args '-p' ,'top_dir/sub_dir_1/sub_dir_2'
    println "This line is printed in configuration phase."
}

Now, since I haven't used '<<' or< 'doFirst/doLast', I expect mkdir to be executed in configuration phase i.e. whenever the build script is compiled. For e.g. if I do

$gradle tasks

I expect mkdir to run in configuration phase i.e. my directory structure should get formed but is not happening.

However I get this output :

yogeshwardancharan@yogeshwardancharan-Lenovo-G570:~/android_learning_resources/gradle_resources/ud867/1.01-Exercise-RunYourFirstTask$ gradle tasks
This line is printed in configuration phase.
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
components - Displays the components produced by root project '1.01-Exercise-RunYourFirstTask'. [incubating]
dependencies - Displays all dependencies declared in root project '1.01-Exercise-RunYourFirstTask'.
dependencyInsight - Displays the insight into a specific dependency in root project '1.01-Exercise-RunYourFirstTask'.
help - Displays a help message.
model - Displays the configuration model of root project '1.01-Exercise-RunYourFirstTask'. [incubating]
projects - Displays the sub-projects of root project '1.01-Exercise-RunYourFirstTask'.
properties - Displays the properties of root project '1.01-Exercise-RunYourFirstTask'.
tasks - Displays the tasks runnable from root project '1.01-Exercise-RunYourFirstTask'.

Other tasks
-----------
makeDirectoryStructure - Creates directory structure .

Now , in above output printing of this line

This line is printed in configuration phase.

confirms that task was indeed processed during configuration phase .

And also , when I issue command

$gradle makeDirectoryStructure

both above line is printed and directory structure also get formed .

So , finally the question is why is my mkdir not being run in configuration phase or am I some very common concept.

Lawton answered 17/6, 2015 at 1:11 Comment(1)
What I understand from this : discuss.gradle.org/t/… is that Exec tasks are only configured during configuration phase and their actual execution takes place in execution phase itself .Lawton
L
5

Please have a look at AbstractExecTask from which Exec inherits. As you can see there are lots of getters and setters. What happens at configuration time is setting the values for that fields only, not running them. All the properties set will be used in only when exec() method annotated with @TaskAction is called - which happens at runtime. Why println works? It's just a method that is invoked, exactly in the same way as the setters mentioned above - println just have a visible effect, while setters just change the properties used later on.

Every task has its actions. The difference is that at configuration phase the task is configured only and this configuration is used while task action is executed.

Lulu answered 17/6, 2015 at 6:43 Comment(1)
thanks a lot for clear explanation ! Also ,this is the reason why we get execCommand == null ! when these configuration properties are put in a doFirst/doLast closure .Lawton
N
4

If you want to to run the command in configuration phase, then use exec block within a Task. To be exact, the Project.exec() method. For example:

task makeDirectoryStructure {
    exec {
        commandLine 'mkdir'
        args '-p' ,'top_dir/sub_dir_1/sub_dir_2'
    }
    description 'Creates directory structure .'
    println "This line is printed in configuration phase."
}

This will create the directories in the configuration phase of Gradle.

Project.exec() in Gradle docs

Noctule answered 19/3, 2019 at 10:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.