簡體   English   中英

如何使用 Gradle 從包含 TGZ 的 TAR 中提取文件?

[英]How can I Extract a File From a TAR containing TGZs using Gradle?

我有一個包含多個tar.gz文件(一個 Docker 映像)的tar文件,我想從中提取一個文件。 在 shell 腳本中執行此操作是微不足道的,但在使用 Gradle 時似乎有點棘手。

這是我到目前為止:

task extractOuter(type: Copy) {
    dependsOn jibBuildTar
    from tarTree(file("${buildDir}/jib-image.tar"))
    include "*.tar.gz"
    into "${buildDir}/tgz"
}

task extractInner(type: Copy) {
    dependsOn extractOuter
    from (fileTree(dir: "${buildDir}/tgz").collect { tarTree(it) }) {
        include "**/filename"
        includeEmptyDirs = false
    }
    into "${buildDir}/files"
}

一開始好像還可以,結果發現偶爾會失敗: extractInner任務沒有找到文件。 也許我沒有正確使用 Gradle 的惰性求值。

如何使它工作? 還是有完全不同的,更優雅的方式?

在 shell 腳本中執行此操作是微不足道的

您可以通過使用Exec任務類型繼續使用 shell 腳本。

但是在使用 Gradle 時似乎有點棘手。

到目前為止,您所擁有的是如何使用 Gradle 做到這一點。 Gradle 的優點是它不會執行已經發生的工作。 有關更多詳細信息,請參閱構建緩存

一開始好像還可以,結果發現偶爾會失敗:extractInner 任務沒有找到文件。 也許我沒有正確使用 Gradle 的惰性求值。

這在上面鏈接的文檔中被調用(強調我的):

有些任務,比如 Copy 或 Jar,通常沒有意義讓緩存成為可能,因為 Gradle 只是將文件從一個位置復制到另一個位置。 使不產生輸出或沒有任務操作的任務可緩存也是沒有意義的。

因此,您已經聲明了您的任務,但您還沒有將它們配置為產生任何可能會或可能不會導致問題的輸出,因為您希望輸出存在於任務依賴項中。

由於Copy擴展了DefaultTask ,您可以使用outputs來設置任務輸出。

task extractOuter(type: Copy) {
    dependsOn jibBuildTar
    outputs.dir(file("$buildDir/tgz")
    from tarTree(file("${buildDir}/jib-image.tar"))
    include "*.tar.gz"
    into "${buildDir}/tgz"
}

task extractInner(type: Copy) {
    dependsOn extractOuter
    outputs.dir(file("$buildDir/files")
    from (fileTree(dir: "${buildDir}/tgz").collect { tarTree(it) }) {
        include "**/filename"
        includeEmptyDirs = false
    }
    into "${buildDir}/files"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM