2013-10-18 61 views
4

這確實是一個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 

我應該如何把這個壓縮在一起的時候我只是有一個文件列表,文件的父根目錄不在我當前的項目下?

感謝您的幫助!

  • 安迪

回答

3

我不知道具體的問題背後是什麼,但我認爲有

inputs.files(prepBundle.outputs.files) 

和/或向(這是多餘的,可以打破東西)

outputs.file(archiveName) 

我想,你想添加所有文件從prepBundle到您的檔案。 當您使用Zip任務的繼承Copy任務的from屬性時,可以輕鬆實現此操作。

使用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部分,並使用from與特定的文件時,output.file(..)因爲include屬性是多餘的。 output.file(..)是多餘的,因爲它已經被Zip任務定義。

+0

謝謝,這是有道理的。我做了改變,但它仍然不適合我 - 它只是提供最新的。我相信它與腳本配置時間和執行時間有關。我不知道如何配置一個任務,其中配置是另一個任務執行的產物,但我需要爲此做另一個問題。謝謝你的幫助! – AndyJ

+0

您是否嘗試過預先調用'clean'任務。 – Peter

+0

我將示例任務'createBundle'中的文件移至另一個文件,並讓'createBundle'任務依賴於新文件。 'createBundle'裏面我現在使用了依賴任務生成的文件列表。 工作正常 – Peter

1

您可以輕鬆創建一個任務一個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 
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) 
相關問題