gpt4 book ai didi

gradle - 对 Gradle 删除任务感到困惑

转载 作者:行者123 更新时间:2023-12-03 04:50:07 30 4
gpt4 key购买 nike

我目前正在学习 Gradle,所以这可能是一个简单的问题,但我似乎无法理解。

我需要在我的 gradle 构建中创建一个删除一组中间文件的任务。所以在谷歌搜索之后,我尝试了以下方法:

task deleteTest (type: Delete) {
doLast {
delete fileTree ('src/main/gen') {
include '**/*'
}
}
}

这没有效果,因为当我运行任务时,“src/main/gen”目录中的所有文件仍然存在。通过阅读各种网站,这似乎是正确的方法,但它就是行不通。

只是为了笑,我试过:

task deleteTest (type: Delete) {
delete fileTree ('src/main/gen') {
include '**/*'
}
}

这似乎有效,所有文件都从目录中删除(尽管它留下了空的子目录,我也不明白)。但据我所知,这不是正确的方法,因为它是在配置期间执行的,而不是在执行期间执行的。

有人可以给我解释一下吗?显然,对于一般的 Gradle,尤其是这个问题,我只是不太了解。

最佳答案

简短答案:

如果你只想删除文件夹 src/main/gen 和里面的所有东西,使用这样的东西:

task deleteTest(type: Delete) {
delete 'src/main/gen'
}

你的第二个例子也很好。它保留目录,因为使用了 fileTree,它只收集文件。

答案:

您的第一个示例混合了两种在 Gradle 中删除文件的方法。第一个是使用 Delete 类型的任务,第二个是调用 Project 类型的方法 delete。但是它们有何不同,为什么它们在您的示例中混合在一起?

Gradle 基于其任务系统,允许定义和配置仅在必要时运行的任务。构建是否需要任务将根据任务依赖性 (dependsOn) 确定。这就是 Gradle 区分配置阶段执行阶段的原因。在配置阶段,除了实际的任务操作(在构建脚本中不可见)和包装在 doFirst/doLast 闭包中的代码外,整个构建脚本都会被执行。在执行阶段,每个必需的任务都由 Gradle 运行。这涉及执行任务的 doFirst 闭包,然后是实际的任务操作,最后是任务的 doLast 闭包。现在,对于像上面那样的 Delete 任务,这意味着配置闭包 delete 'src/main/gen' 中的代码在配置阶段执行,但实际稍后在执行阶段删除文件(任务操作)。

当需要直接或一直删除文件时(例如在插件或其他场景中),这种方法就会出现问题。创建任务、设置依赖项等都太复杂了。 Project 类型的方法 delete 来拯救。它提供与任务类型 Delete 相同的配置接口(interface),但直接执行。它可以通过项目实例(例如 project.delete 'src/main/gen')在脚本的任何地方调用并立即运行,但是因为使用了 project 实例作为整个脚本的范围,仅使用 delete 也足够了。好吧,这并不总是足够的。如果当前作用域提供了一个名为 delete 的方法(具有相同的签名),则将改用此方法。这是 Delete 类型的任务中的情况,这就是您的第一个脚本不起作用的原因:

Delete 类型的任务在 doLast 闭包中配置,该闭包实际删除应该发生后运行。如果删除 type: Delete,方法 delete 将不再配置任务,而是立即删除文件,因为它不再是方法 delete 的任务 Delete,但是 Project 类型的方法 delete。这工作正常,但应该首选使用真实任务。

如果您从第二个示例中删除 type: Delete,将会发生同样的事情。文件将被立即删除(现在在配置阶段),而不是配置任务。您不希望出现此行为,因为任务将过时,因为每次调用 Gradle 时文件都会被删除。这就是您提到的一个可能的问题。

关于gradle - 对 Gradle 删除任务感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57974585/

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