gpt4 book ai didi

Android - 参数类型为 :Exec runs automatically on build, 的顶级 gradle 任务为什么?

转载 作者:行者123 更新时间:2023-11-29 20:13:57 25 4
gpt4 key购买 nike

我有一个运行 shell 脚本的任务。它仅驻留在我的顶级 gradle 文件中。所以我说的 gradle 文件可以在这里看到:

enter image description here

现在有趣的是,我在名为 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'
}
}

现在,每当我构建项目时,都会执行此任务。只要我构建项目(又名编译它),这个任务就会运行。那是正常的吗?我在那里放了一条打印线以确保每次我构建“应用程序”模块时它都会运行。这正常吗。如果我不希望它那样做怎么办?

更新:现在经过研究,我发现如果这样定义,一些 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'
}

关于Android - 参数类型为 :Exec runs automatically on build, 的顶级 gradle 任务为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34347268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com