gpt4 book ai didi

file-io - Gradle任务: how to wait for the file operation to complete

转载 作者:行者123 更新时间:2023-12-02 18:36:02 24 4
gpt4 key购买 nike

这就是我正在尝试做的事情:

  1. 将构建脚本依赖项中的存档 (zip) 复制到临时目录
  2. 将存档解压到 build 中的另一个目录

这是复制存档(作品)的任务

task copyTpcds(type: Copy) {  
file('build/zip').mkdirs()
from buildscript.configurations.classpath
include 'tpcds*'
into 'build/zip'
}

以及解压缩然后删除存档的任务

task extractTpcds(type: Copy) {  
def names = new FileNameFinder().getFileNames('build/zip', 'tpcds*')
def outDir = file('build/cmd/tpcds')
outDir.mkdirs() // make sure the directory exists
from zipTree(file(names[0])) // generates error when
into outDir
// now remove copied zip file
//zipFile.delete() // deletes file before the extractions completes?
}

以下是一些场景:

  1. 如果我将这两个任务放入 build.gradle 并尝试运行任何内容,甚至只是 gradle 任务,那么我会收到此错误:路径和 baseDir 都不能为 null 或空字符串。 path='null' basedir='C:\dev\code\td\pdo\tpcds-tpg' 来自任务 #2 中的此代码:file(names[0])
  2. 如果我注释掉第二个任务中的代码,第一个任务将运行并将 zip 文件复制到 build/zip
  3. 现在我可以取消第二个任务中的代码注释(删除除外)并执行 gradle extractTpcds 它将运行并提取存档

所以在我看来

  1. 无论执行哪个任务,都会在所有任务中评估文件操作
  2. 如果我有一个复制文件的代码,并带有一些尝试对正在复制的文件进行操作的后续代码,那么该代码将不会等待复制过程完成,并且会失败,因为文件尚不存在

我不知道如何处理这个问题,非常感谢您的建议

最佳答案

以下内容对我有用,使用 Gradle 2.12(并假设 zip 文件位于 files ):

buildscript {
configurations {
classpath
}

dependencies {
classpath files("files/tpcds.zip")
}
}

def copyFiles = { ->
ant.mkdir(dir: "build/zip")
buildscript.configurations.classpath.each { def thisFile ->
if (thisFile.name ==~ /tpcds.*/) {
ant.copy(file: thisFile.absolutePath, todir: "build/zip")
}
}
}

tasks.whenTaskAdded { task ->
if (task.name == "extractTpcds") {
copyFiles()
}
}

task copyTpcds << {
copyFiles()
}

task extractTpcds(type: Copy) {
def names = new FileNameFinder().getFileNames('build/zip', 'tpcds*')
def outDir = file('build/cmd/tpcds')
outDir.mkdirs() // make sure the directory exists
from zipTree(file(names[0])) // generates error when
into outDir
// now remove copied zip file
//zipFile.delete() // deletes file before the extractions completes?
}

原始问题涉及与 ICE 规则的阻抗不匹配:初始化阶段、配置阶段和执行阶段。特别是,Copy任务的规范是在Configuration阶段;通常,在执行阶段会强制执行任务依赖性(例如 dependsOn )。 extractTpcds任务在配置阶段依赖于其他代码。

在我的例子中,有两种情况:

  • gradle copyTpcds将调用 copyFiles执行阶段的方法。 <<意思是“[在执行阶段]最后做这件事”。
  • gradle tasks将触发whenTaskAdded中的代码,在配置阶段,并调用 copyFilesgradle extractTpcds 类似

另一种方法是在这两个任务中使用 AntBuilder,并避免 Type: Copy完全如此,如下所示:

buildscript {
configurations {
classpath
}
dependencies {
classpath files("files/tpcds.zip")
}
}

task copyTpcds << {
ant.mkdir(dir: "build/zip")
buildscript.configurations.classpath.each { def thisFile ->
if (thisFile.name ==~ /tpcds.*/) {
ant.copy(file: thisFile.absolutePath, todir: "build/zip")
}
}
}

task extractTpcds(dependsOn: 'copyTpcds') << {
def outDir = "build/cmd/tpcds"
ant.mkdir(dir: outDir)
def names = new FileNameFinder().getFileNames('build/zip', 'tpcds*')
names.eachWithIndex { zipFile, index ->
if (index == 0) {
ant.unzip(src: zipFile, dest: outDir)
}
}
}

关于file-io - Gradle任务: how to wait for the file operation to complete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221801/

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