我目前正在学习 Gradle,所以这可能是一个简单的问题,但我似乎无法理解。
我需要在我的 gradle 构建中创建一个任务来删除一组中间文件。经过一番谷歌搜索后,我尝试了以下方法:
task deleteTest (type: Delete) {
doLast {
delete fileTree ('src/main/gen') {
include '**/*'
}
}
}
Run Code Online (Sandbox Code Playgroud)
这没有效果,因为当我运行任务时,“src/main/gen”目录中的所有文件仍然存在。通过阅读各种网站,这似乎是正确的方法,但它就是行不通。
只是为了笑,我尝试过:
task deleteTest (type: Delete) {
delete fileTree ('src/main/gen') {
include '**/*'
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,所有文件都从目录中删除(尽管它留下了空的子目录,我也不明白)。但据我所知,这不是正确的方法,因为它在配置期间执行,而不是在执行期间执行。
有人可以向我解释一下吗?显然,对于 Gradle,尤其是这个问题,我并没有很理解。
Luk*_*fer 10
简短的回答:
如果您只想删除该文件夹src/main/gen及其内部所有内容,请使用如下内容:
task deleteTest(type: Delete) {
delete 'src/main/gen'
}
Run Code Online (Sandbox Code Playgroud)
你的第二个例子也很好。它保留目录,因为fileTree使用了 a,它只收集文件。
长答案:
您的第一个示例混合了在 Gradle 中删除文件的两种方法。第一个是使用类型的任务Delete,第二个是调用delete类型的方法Project。但它们有何不同以及为什么它们在您的示例中混合在一起?
Gradle 基于其任务系统,允许定义和配置仅在必要时运行的任务。构建是否需要某个任务将根据任务依赖性 ( dependsOn) 来确定。这就是Gradle区分配置阶段和执行阶段的原因。在配置阶段,除了实际的任务操作(在构建脚本中不可见)和doFirst/doLast闭包中包含的代码之外,整个构建脚本都会被执行。在执行阶段,每个必需的任务都由 Gradle 运行。这涉及执行doFirst任务的闭包,然后执行实际的任务操作,最后执行doLast任务的闭包。现在,对于Delete像上面这样的任务,这意味着配置闭包中的代码delete 'src/main/gen'在配置阶段执行,但实际删除文件(任务操作)发生在稍后的执行阶段。
当需要直接或始终删除文件(例如在插件或其他场景中)时,这种方法就会出现问题。创建任务、设置依赖项等都太复杂了。delete这是类型方法的Project救援。它提供与任务类型相同的配置接口Delete,但直接执行。它可以通过project.delete 'src/main/gen'脚本中各处的项目实例(例如 )调用并立即运行,但由于该project实例用作整个脚本的范围,因此仅使用delete也足够了。嗯,这并不总是足够的。如果当前作用域提供了一个名为的方法delete(具有相同的签名),则将使用该方法。这是类型任务中的情况Delete,这就是您的第一个脚本不起作用的原因:
您的任务类型Delete在闭包中配置doLast,该闭包在实际删除发生后运行。如果删除type: Delete,该方法delete将不再配置任务,而是立即删除文件,因为它不再是delete任务的方法,而是类型的Delete方法。这工作得很好,但应该优先使用实际任务。deleteProject
如果您从第二个示例中删除type: Delete,也会发生同样的情况。文件将被立即删除(现在在配置阶段),而不是配置任务。您不希望出现这种行为,因为该任务将过时,因为每次调用 Gradle 时都会删除文件。这就是您提到的可能存在的问题。
| 归档时间: |
|
| 查看次数: |
3367 次 |
| 最近记录: |