Android - 带有参数 type:Exec 的顶级 gradle 任务在构建时自动运行,为什么?
Android - top level gradle task with parameter type:Exec runs automatically on build, why?
我有一个任务是 运行 一个 shell 脚本。它仅位于我的顶级 gradle 文件中。所以我说的 gradle 文件可以在这里看到:
现在有趣的是,我在名为 copyFiles 的文件中有一个任务,它只是 运行 一个简单的 shell 脚本来复制文件。我现在要向您展示我的整个 build.gradle 顶级文件:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
task copyFiles(type:Exec) {
exec {
commandLine 'sh', './copyFiles.sh'
}
}
现在,每当我构建项目时,都会执行此任务。只要我构建项目(又名编译它)这个任务 运行s。那是正常的吗?我在其中放了一条打印线以确保,是的,每次我构建 'app' 模块时它都会得到 运行。这正常吗。如果我不希望它那样做怎么办?
更新:现在经过研究我发现一些 gradle 任务可以立即执行而无需调用,如果定义如下:
//option 1, this runs right away on build
task foo(type: Exec) {
// this is configuration
// i.e. it runs regardless
}
//option 2 this runs only when called on
task bar(type: Exec) << {
// this is execution
// i.e. it only runs if you call the task
}
然后我想我会尝试同样的事情:
task copyFiles(type: Copy) {
from '/Users/myuser/Documents/androidstudio/MyApplication/Common/'
into '/Users/myuser/Documents/androidstudio/MyApplication/app/src/main/assets'
}
但令我惊讶的是它自己并没有得到 运行。我实际上必须打电话给它吗?这与 type:Exec 有何不同?为什么没有一致性?
更新:
我写了一篇关于 the gradle lifecycle 的博客,供在我分析后需要帮助的任何人使用。
您可能需要阅读有关 build lifecycle 的内容。当您 运行 构建时,此构建会经历 3 个阶段:初始化、配置和执行。
当您将闭包声明为:
task foo(type: Exec) {
// this is configuration
// i.e. it runs regardless
}
然后在配置阶段为所有任务执行此闭包,这就是为什么总是调用打印行,即使任务 shell 未执行。它只是整个配置的一部分。
但是如果你用 <<
声明一个闭包,如:
task bar(type: Exec) << {
// this is execution
// i.e. it only runs if you call the task
}
在执行阶段执行。实际上,<<
等于任务的 doLast
。
此外,然后在任务中使用 exec {}
符号,在其中创建执行子任务。
因此,如果您不想在配置中 运行 它,那么只需将它与 <<
一起使用,或者不要在其中调用额外的 exec
任务一个任务,它本身是 Exec
类型并正确配置它,例如:
task copyFiles(type:Exec) {
commandLine 'sh', './copyFiles.sh'
}
我有一个任务是 运行 一个 shell 脚本。它仅位于我的顶级 gradle 文件中。所以我说的 gradle 文件可以在这里看到:
现在有趣的是,我在名为 copyFiles 的文件中有一个任务,它只是 运行 一个简单的 shell 脚本来复制文件。我现在要向您展示我的整个 build.gradle 顶级文件:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
task copyFiles(type:Exec) {
exec {
commandLine 'sh', './copyFiles.sh'
}
}
现在,每当我构建项目时,都会执行此任务。只要我构建项目(又名编译它)这个任务 运行s。那是正常的吗?我在其中放了一条打印线以确保,是的,每次我构建 'app' 模块时它都会得到 运行。这正常吗。如果我不希望它那样做怎么办?
更新:现在经过研究我发现一些 gradle 任务可以立即执行而无需调用,如果定义如下:
//option 1, this runs right away on build
task foo(type: Exec) {
// this is configuration
// i.e. it runs regardless
}
//option 2 this runs only when called on
task bar(type: Exec) << {
// this is execution
// i.e. it only runs if you call the task
}
然后我想我会尝试同样的事情:
task copyFiles(type: Copy) {
from '/Users/myuser/Documents/androidstudio/MyApplication/Common/'
into '/Users/myuser/Documents/androidstudio/MyApplication/app/src/main/assets'
}
但令我惊讶的是它自己并没有得到 运行。我实际上必须打电话给它吗?这与 type:Exec 有何不同?为什么没有一致性?
更新:
我写了一篇关于 the gradle lifecycle 的博客,供在我分析后需要帮助的任何人使用。
您可能需要阅读有关 build lifecycle 的内容。当您 运行 构建时,此构建会经历 3 个阶段:初始化、配置和执行。
当您将闭包声明为:
task foo(type: Exec) {
// this is configuration
// i.e. it runs regardless
}
然后在配置阶段为所有任务执行此闭包,这就是为什么总是调用打印行,即使任务 shell 未执行。它只是整个配置的一部分。
但是如果你用 <<
声明一个闭包,如:
task bar(type: Exec) << {
// this is execution
// i.e. it only runs if you call the task
}
在执行阶段执行。实际上,<<
等于任务的 doLast
。
此外,然后在任务中使用 exec {}
符号,在其中创建执行子任务。
因此,如果您不想在配置中 运行 它,那么只需将它与 <<
一起使用,或者不要在其中调用额外的 exec
任务一个任务,它本身是 Exec
类型并正确配置它,例如:
task copyFiles(type:Exec) {
commandLine 'sh', './copyFiles.sh'
}