Gradle Exec:为什么它没有在配置阶段运行?

问题描述 投票:3回答:2

这是我的:

的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."
}

现在,由于我没有使用'<<'或<'doFirst / doLast',我希望mkdir在配置阶段执行,即每当编译构建脚本时。对于例如如果我做

$gradle tasks

我希望mkdir在配置阶段运行,即我的目录结构应该已经形成但是没有发生。

但是我得到了这个输出:

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 .

现在,在上面这行输出打印

该行在配置阶段打印。

确认在配置阶段确实处理了任务。

而且,当我发出命令时

$gradle makeDirectoryStructure

上面的两行都打印出来,目录结构也就形成了。

所以,最后问题是为什么我的mkdir没有在配置阶段运行,或者我是一个非常常见的概念。

gradle exec mkdir
2个回答
3
投票

请看看AbstractExecTask继承的Exec。如你所见,有很多吸气剂和制定者。配置时发生的情况是仅设置该字段的值,而不是运行它们。只有当调用用exec()注释的@TaskAction方法时才会使用所有属性集 - 这在运行时发生。为什么println有效?它只是一个被调用的方法,与上面提到的setter完全相同 - println只有一个可见的效果,而setter只是改变以后使用的属性。

每个任务都有自己的行动。不同之处在于,在配置阶段,仅配置任务,并在执行任务操作时使用此配置。


0
投票

如果要在配置阶段运行该命令,请在任务中使用exec块。确切地说,Project.exec()方法。例如:

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."
}

这将在Gradle的配置阶段创建目录。

Project.exec() in Gradle docs

© www.soinside.com 2019 - 2024. All rights reserved.