Gradle将一个拉链分解成一个buildDir

Gradle将一个拉链分解成一个buildDir,gradle,Gradle,我的项目有一个远程依赖项,它实际上只是某些文件的压缩,需要在某个地方解压缩,以便构建可以从这些文件生成新的java源代码。(我说的是一般性问题,而不是具体问题) 我没想到这会这么难,但我一直无法让它工作。以下是我创建的内容: 我定义了一个新配置: configurations { newConf } 稍后,我为这个确认定义了一个依赖项。它解析为我需要分解的zip文件: dependencies { newConf "group:name:version@zip" } 到目前为

我的项目有一个远程依赖项,它实际上只是某些文件的压缩,需要在某个地方解压缩,以便构建可以从这些文件生成新的java源代码。(我说的是一般性问题,而不是具体问题)

我没想到这会这么难,但我一直无法让它工作。以下是我创建的内容:

我定义了一个新配置:

configurations {
    newConf
}
稍后,我为这个确认定义了一个依赖项。它解析为我需要分解的zip文件:

dependencies {
    newConf "group:name:version@zip"
}
到目前为止,这一切对我来说都是正确的,尽管如果有人不同意,我会倾听

最后,我需要定义一个任务,将zip分解成一个目录,然后该目录将成为后续代码生成命令的输入

task explodeModel {
    description = "unzip model into the specified 'modelSrc' directory"

    //input is a "files" collection (usually just one:  the zip)
    //output is the specified modelSrc dir

    File modelSrc = new File("$buildDir/modelSrc")
    outputs.files modelSrc

    doLast {
        configurations.newConf.allArtifacts.each { artifact -> println artifact }
    }

}
显然,doLast还没有解压任何东西,我只是想找到一条到zipfile本身的绝对路径,这就是我被卡住的地方。我不知道如何获取该文件的路径,以便解压缩它。有什么帮助吗


非常感谢

我在自己编写的插件中做了类似的事情。这应该适合您:

configurations.newConf.singleFile
假设只有一个文件。返回类型为
java.io.File

有关更多信息,请查看此类。关联方法是
配置下载SDK
。解压的任务是。

尝试以下方法,应该可以:

task explodeModel(type: Copy){
  configurations.newConf.filter { it.toString().endsWith(".zip") }.each{
    from zipTree(it)
  }
  into 'output/dir'
}

当然,如果您确定配置中的工件是zip,您可以省略
.zip
过滤部分。

以下是我最近所做的事情,我对此很满意:
(本例假设一个名为
zipFiles
的配置只包含ZIP文件。)


细节 这种方法有几点我很喜欢:

  • 解压的输出由实际的
    文件树
    表示,而不是在整个构建过程中使用神奇的字符串
    “$buildDir/unpacedzipfiles”
    。这使得在将来的复制类任务中使用输出变得非常简单:

    aCopyLikeTask(type: Copy) {
        from unpackedZipFiles
        // ...
    }
    
  • 使用解压文件的任务并不直接依赖于解压文件的任务。相反,它们依赖于
    FileTree
    本身,它知道如何解压缩文件。请注意,
    FileTree
    扩展了
    Buildable
    ,因此可以是任务的依赖项:

    aNonCopyTask(dependsOn: unpackedZipFiles) << {
        // ... do stuff that references unpackedZipFiles.dir
    }
    
  • 我的解决方案(根据我们的代码进行了调整)将遵循

    task explodeModel(type: Copy) {
        configurations.newConf.resolvedConfiguration.resolvedArtifacts.each { artifact ->
            if (artifact.file.name.endsWith('.zip')) {
                from zipTree(artifact.file)
                into '.'
            }
        }
    }
    

    此解决方案的优点是,它可以针对已解决的(而不是请求的)工件工作。

    非常感谢,这对我来说很有效。我确实想知道是否有一种解决方案适用于多个依赖项,因此我将看看是否有其他人提供了一个,否则复选标记将指向您!一个问题:我在文档的任何地方都没有看到“singleFile”,我希望它是一个属性或方法。有没有什么地方我应该可以自己找到这个?这个方法实际上来自FileCollection。接口配置扩展了FileCollection。如果您需要多个依赖项,可以使用该方法。您好,请告诉我中定义了GradleIt的
    $buildDir
    在哪里。我想如果您只需要路径,可以使用configurations.newConf.files.each{println it}
    myExecTask(dependsOn: unpackedZipFiles) << {
        "${unpackedZipFiles.dir}/bin/runMe".execute([], unpackedZipFiles.dir)
    }
    
    task explodeModel(type: Copy) {
        configurations.newConf.resolvedConfiguration.resolvedArtifacts.each { artifact ->
            if (artifact.file.name.endsWith('.zip')) {
                from zipTree(artifact.file)
                into '.'
            }
        }
    }