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