這確實是一個gradle新手問題,但它真的打我。我的源樹是這個樣子:如何從文件列表中創建gradle中的zip?
|-- master
buildSrc
build.gradle
|-- comp1
!-- filea
!-- fileb
|-- comp2
!-- file1
!-- file2
!-- etc
我在使用自定義任務(稱爲prepBundle(未顯示)),以產生需要在一個文件的列表master
目錄運行build.gradle
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我遍歷文件列表中並沒有任何文件是被另一個進程使用。我不相信這是一個gradle問題,我認爲這是我配置zip任務時遇到的問題。如果我改變createBundle
有點下降的輸入和輸出,它看起來像這樣:
task createBundle(type:Zip,dependsOn:prepBundle){
baseName = "somebundle"
include prepBundle.outputs.files
}
但後來沒有做任何事情:
:createBundle UP-TO-DATE
BUILD SUCCESSFUL
我應該如何把這個壓縮在一起的時候我只是有一個文件列表,文件的父根目錄不在我當前的項目下?
感謝您的幫助!
- 安迪
謝謝,這是有道理的。我做了改變,但它仍然不適合我 - 它只是提供最新的。我相信它與腳本配置時間和執行時間有關。我不知道如何配置一個任務,其中配置是另一個任務執行的產物,但我需要爲此做另一個問題。謝謝你的幫助! – AndyJ
您是否嘗試過預先調用'clean'任務。 – Peter
我將示例任務'createBundle'中的文件移至另一個文件,並讓'createBundle'任務依賴於新文件。 'createBundle'裏面我現在使用了依賴任務生成的文件列表。 工作正常 – Peter