2014-12-04 17 views
5

Gibt es eine Möglichkeit, das Überschreiben von Dateien zu vermeiden, wenn Task type:Copy verwendet wird?Gradle kopieren ohne zu überschreiben

Das ist meine Aufgabe:

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" 
} 

ich vermeiden wollen, dass alle Dateien angeben Verwendung auszuschließen 'Datei/file *'.

Es sieht so aus, duplicatesStrategy= DuplicatesStrategy.EXCLUDE funktioniert nicht. Ich habe über ein Problem auf Gradle 0.9 gelesen, aber ich benutze Gradle 2.1.

Ist dieses Problem immer noch vorhanden?

Oder missverstehe ich, wie diese Aufgabe richtig verwendet werden sollte?

Dank

+0

Was genau meinen Sie mit „Gibt es eine Möglichkeit des Überschreiben von Dateien zu vermeiden,“? Im obigen Code wird das zweite "in" das erste gewinnen (es kann nur ein Top-Level "in" geben). Auch "in" und "von" können für dieselbe Kopieraufgabe niemals identisch sein. –

+0

Auch wenn ich diese Aufgabe ausführen Gradle die Datei in WebContent überschreiben 'Aufgabe auspacken (Typ: Copy) { \t duplicatesStrategy = DuplicatesStrategy.EXCLUDE \t von rootDir.getPath() + "/ tmp" \t in„WebContent " }' – carlitos081

+1

Ich sehe was du meinst. 'DuplicatesStrategy' handelt von Duplikaten in Kopierquellen (' from'). Es gibt keine Konfigurationsoption, um eine 'Copy'-Aufgabe anzuweisen, Dateien, die bereits im Zielverzeichnis existieren, nicht zu überschreiben, aber Sie könnten dies wahrscheinlich mit' eachFile' erreichen. Weitere Informationen finden Sie unter "Kopieren" in der [Gradle Build Language-Referenz] (http://gradle.org/docs/current/dsl/index.html). Sie finden möglicherweise auch ein verwandtes Sample im Verzeichnis 'samples' des' gradle-all'-Downloads. –

Antwort

2

Sie können immer zuerst prüfen, ob die Datei im Verzeichnis Ziel vorhanden:

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

Probe basierend auf Peters Kommentar:

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

Eine weitere Verfeinerung der Antwort des BugOrFeature. Es ist mit einfachen Zeichenkette für den von und in den Parameter verwenden die destinationDir Eigenschaft CopySpec die Zieldatei der relativen Pfad zu einer Datei zu beheben:

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