Gradle 执行:为什么它不在配置阶段 运行?
Gradle Exec : Why it is not running in configuration phase?
这是我的:
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 .
现在,在上面这一行的输出打印中
This line is printed in configuration phase.
确认在配置阶段确实处理了任务。
而且,当我发出命令时
$gradle makeDirectoryStructure
上面的行都被打印出来了,目录结构也形成了。
所以,最后的问题是为什么我的 mkdir 在配置阶段没有 运行 或者我是一些非常常见的概念。
请查看 Exec
继承的 AbstractExecTask
。如您所见,有很多 getter 和 setter。配置时发生的只是为 字段 设置值,而不是 运行 它们。仅当调用带有 @TaskAction
注释的 exec()
方法时,才会使用所有属性集 - 这发生在运行时。为什么 println
有效?它只是一个被调用的方法,与上面提到的 setter 完全相同 - println
只是有一个可见的效果,而 setter 只是更改稍后使用的属性。
每个任务都有它的动作。不同之处在于,在配置阶段仅配置任务,并且在执行任务操作时使用此配置。
如果您想 运行 配置阶段的命令,请在任务中使用 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 的配置阶段创建目录。
这是我的:
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 .
现在,在上面这一行的输出打印中
This line is printed in configuration phase.
确认在配置阶段确实处理了任务。
而且,当我发出命令时
$gradle makeDirectoryStructure
上面的行都被打印出来了,目录结构也形成了。
所以,最后的问题是为什么我的 mkdir 在配置阶段没有 运行 或者我是一些非常常见的概念。
请查看 Exec
继承的 AbstractExecTask
。如您所见,有很多 getter 和 setter。配置时发生的只是为 字段 设置值,而不是 运行 它们。仅当调用带有 @TaskAction
注释的 exec()
方法时,才会使用所有属性集 - 这发生在运行时。为什么 println
有效?它只是一个被调用的方法,与上面提到的 setter 完全相同 - println
只是有一个可见的效果,而 setter 只是更改稍后使用的属性。
每个任务都有它的动作。不同之处在于,在配置阶段仅配置任务,并且在执行任务操作时使用此配置。
如果您想 运行 配置阶段的命令,请在任务中使用 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 的配置阶段创建目录。