这绝对是一个愚蠢的新手问题,但它真的打败了我。我的源代码树如下所示:
|-- master
buildSrc
build.gradle
|-- comp1
!-- filea
!-- fileb
|-- comp2
!-- file1
!-- file2
!-- etc
我在build.gradle
目录中运行master
,该目录使用自定义任务(在prepBundle(未显示)中调用)来生成需要在zip文件中的文件列表。列表中有一些不同的外部处理,因此无法使用任何基本包含或闭包来提供列表。
这就是我所拥有的:
task showFilelist(dependsOn:prepBundle){
prepBundle.outputs.files.each{
println "including file: ${it}"
}
}
task createBundle(type:Zip,dependsOn:prepBundle){
inputs.files(prepBundle.outputs.files)
outputs.file(archiveName)
baseName = "somebundle"
from ".."
include prepBundle.outputs.files
}
如果我只是运行showFilelist,我会获得正确解析的路径到我想要压缩的文件:
<snip>
:showFilelist
including file: C:\fullpath\master\build.gradle
including file: C:\fullpath\comp1\filea
including file: C:\fullpath\comp2\file1
但是当我运行我的捆绑任务时,它会爆炸:
:createBundle
FAILURE: Build aborted because of an internal error.
* What went wrong:
Build aborted because of an unexpected internal error. Please file an issue at: http://forums.gradle.org.
* Try:
Run with --debug option to get additional debug info.
* Exception is:
org.gradle.api.UncheckedIOException: java.io.IOException: The process cannot access the file because another process has locked a portion of the file
at org.gradle.util.hash.HashUtil.createHash(HashUtil.java:56)
at org.gradle.util.hash.HashUtil.createHash(HashUtil.java:34)
at org.gradle.api.internal.changedetection.state.DefaultHasher.hash(DefaultHasher.java:24)
at org.gradle.api.internal.changedetection.state.CachingHasher.hash(CachingHasher.java:45)
at org.gradle.api.internal.changedetection.state.DefaultFileSnapshotter$1.run(DefaultFileSnapshotter.j
ava:48)
at org.gradle.internal.Factories$1.create(Factories.java:22)
at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:143)
at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:131)
at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.
在prepBundle中,我迭代文件列表,并且没有任何文件被另一个进程使用。我不相信这是一个问题,我认为这是我在配置zip任务时遇到的问题。如果我改变createBundle
以丢弃输入和输出,它看起来像这样:
task createBundle(type:Zip,dependsOn:prepBundle){
baseName = "somebundle"
include prepBundle.outputs.files
}
但后来没有做任何事情:
:createBundle UP-TO-DATE
BUILD SUCCESSFUL
当我只有一个文件列表并且文件的父根目录不在我当前的项目下时,我应该如何将这个zip放在一起?
感谢您的帮助!
答案 0 :(得分:3)
我不确定背后的具体问题是什么,但我认为必须使用
inputs.files(prepBundle.outputs.files)
和/或(这是多余的,可能会破坏事情)
outputs.file(archiveName)
我想,您希望将prepBundle
中的所有文件添加到您的存档中。
当您使用from
任务的继承Copy
任务的Zip
属性时,可以轻松实现此目的。
使用from
属性会将您的任务更改为
task createBundle(type:Zip,dependsOn:prepBundle){
prepBundle.outputs.files.each {
from it.getPath() // adds every single file to the archive
}
baseName = "somebundle"
from ".." // I assume that you add another path here not ".."
}
正如您所看到的,我也跳过include
部分和output.file(..)
,因为include
属性在将from
与特定文件一起使用时是多余的。 output.file(..)
是多余的,因为它已由Zip
任务定义。
答案 1 :(得分:2)
您可以使用任务轻松创建zip文件,请查看以下示例:
task createDist(type: Zip){
archiveName="dist.zip"
destinationDir = file('build/')
from (files('./test-module/build/libs'))
}
您可以使用各种方法在此处包含文件,例如:
from fileTree('./libs')
from project('config').jar.outputs.files
from project('core').jar.outputs.files
from project('batch-jobs').jar.outputs.files
from project('gateway1').jar.outputs.files
from project('gateway2').jar.outputs.files
答案 2 :(得分:0)
仅供参考,我有这个,它工作正常。 (nar = jar) 没有archiveName和destinationDir它对我不起作用
task zip(type: Zip) {
archiveName=rootProject.name+"-"+project.version+".zip"
destinationDir = file('build/')
project.subprojects.nar.outputs.files.files.each{
from it.first().getPath()
}
}
zip.dependsOn(subprojects.nar)