2014-12-04 84 views
5

當使用任務type:Copy時,有沒有辦法避免覆蓋文件?沒有覆蓋的Gradle副本

這是我的任務:

task unpack1(type:Copy) 
{ 
    duplicatesStrategy= DuplicatesStrategy.EXCLUDE 

    delete(rootDir.getPath()+"/tmp") 

    from zipTree(rootDir.getPath()+"/app-war/app.war") 
    into rootDir.getPath()+"/tmp" 


    duplicatesStrategy= DuplicatesStrategy.EXCLUDE 
    from rootDir.getPath()+"/tmp" 
    into "WebContent" 
} 

我想避免指定使用排除「文件/文件*」的所有文件。

看起來像duplicatesStrategy= DuplicatesStrategy.EXCLUDE不起作用。我讀了關於gradle 0.9的一個問題,但我使用了Gradle 2.1。

這個問題還在嗎?

或者我誤解了這個任務應該如何正確使用?

感謝

+0

究竟你是「有沒有一種方法,以避免覆蓋文件」是什麼意思?在上面的代碼中,第二個'into'將會贏得第一個(可能只有一個頂級'into')。另外,對於同一個Copy任務,「into」和「from」永遠不會相同。 – 2014-12-04 14:59:53

+0

即使我運行該任務搖籃覆蓋該文件到的WebContent '任務解包(類型:複製) { \t duplicatesStrategy = DuplicatesStrategy.EXCLUDE \t從rootDir.getPath()+ 「/ TMP」 \t入「的WebContent 「 }' – carlitos081 2014-12-04 15:53:10

+1

我明白你的意思了。 'DuplicatesStrategy'是關於複製源('from')中的重複項。沒有配置選項來告訴'Copy'任務不要覆蓋目標目錄中已存在的文件,但可以使用'eachFile'來實現。有關詳細信息,請參閱[Gradle Build Language Reference](http://gradle.org/docs/current/dsl/index.html)中的'Copy'。您也可以在'gradle-all'下載的'samples'目錄中找到相關示例。 – 2014-12-04 16:44:49

回答

2

你總是可以首先檢查該文件中的目標目錄存在:

task copyFileIfNotExists << { 
    if (!file('destination/directory/myFile').exists()) 
    copy { 
     from("source/directory") 
     into("destination/directory") 
     include("myFile") 
    } 
} 
0

樣品基於彼得的評論:

task unpack1(type: Copy) { 

    def destination = project.file("WebContent") 
    from rootDir.getPath() + "/tmp" 
    into destination 
    eachFile { 
     if (it.getRelativePath().getFile(destination).exists()) { 
      it.exclude() 
     } 
    } 
} 
1

BugOrFeature的回答的進一步細化。它使用了從進入參數簡單的字符串,使用CopySpec的destinationDir屬性來解析到一個文件的目標文件的相對路徑:

task ensureLocalTestProperties(type: Copy) { 
    from zipTree('/app-war/app.war') 
    into 'WebContent' 
    eachFile { 
     if (it.relativePath.getFile(destinationDir).exists()) { 
      it.exclude() 
     } 
    } 
}