Gradle任务:如何等待文件操作完成

波斯顿

这是我想做的事情:

  1. 将压缩文件(zip)从buildscript依赖项复制到temp目录
  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 tasks这样,我也会收到此错误:Neither path nor baseDir may be null or empty string. 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规则相对的阻抗失配:初始化阶段,配置阶段和执行阶段。特别是,复制任务的规范处于配置阶段。通常,dependsOn在执行阶段会强制执行任务相关性(例如)。extractTpcds配置阶段,任务依赖于其他代码

在我的示例中,有2种情况:

  • gradle copyTpcdscopyFiles在执行阶段调用该方法。<<意思是“做[在执行阶段]这个东西最后一个”。
  • gradle taskswhenTaskAdded在配置阶段触发中的代码,并调用copyFiles同样的gradle 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)
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我如何等待外部过程完成?

来自分类Dev

如何等待接受CancellationToken的多个任务?

来自分类Dev

如何等待IntentService完成其任务

来自分类Dev

AngularJS:如何等待$ resource完成?

来自分类Dev

如何等待并行Linq动作完成

来自分类Dev

如何等待文件创建

来自分类Dev

如何等待直到Task.ContinueWith内部任务完成

来自分类Dev

我应该如何等待GCD中并行异步任务的完成?

来自分类Dev

如何等待document.write完成

来自分类Dev

Android如何等待AsyncTask完成

来自分类Dev

如何等待create_task()创建的任务完成?

来自分类Dev

如何等待Java中的多个任务完成?

来自分类Dev

RxJava测试:如何等待所有后台任务完成

来自分类Dev

如何等待所有NSOperations完成?

来自分类Dev

如何等待使用Java 7的文件API操作完成?

来自分类Dev

如何等待功能完成?

来自分类Dev

如何等待诺言完成

来自分类Dev

如何等待功能完成?

来自分类Dev

如何等待任务完成

来自分类Dev

如何等待(TPL)任务启动?

来自分类Dev

如何等待IntentService完成其任务

来自分类Dev

如何等待按钮完成其任务然后执行下一行代码

来自分类Dev

我如何等待文件下载完成

来自分类Dev

如何等待ThreadPoolExecutor中的所有任务在超时内完成而又不关闭Executor?

来自分类Dev

NodeJS如何等待多任务完成

来自分类Dev

从C#中的方法返回之前如何等待所有任务完成

来自分类Dev

如何等待任务的完成及其继续?

来自分类Dev

如何等待运行异步方法的任务

来自分类Dev

如何等待多个批处理文件完成