2014-12-04 16 views
5

Czy istnieje sposób na uniknięcie zastępowania plików podczas korzystania z zadania type:Copy?Kopiowanie z gradientem bez nadpisywania

To jest moje zadanie:

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

chcę uniknąć określić wszystkie pliki za pomocą wykluczyć 'file/plik *'.

Wygląda na to, że duplicatesStrategy= DuplicatesStrategy.EXCLUDE nie działa. Czytałem o problemie na gradle 0.9, ale używam Gradle 2.1.

Czy ten problem nadal istnieje?

Czy nie rozumiem, w jaki sposób to zadanie powinno być właściwie używane?

Dzięki

+0

Co dokładnie masz na myśli przez „Czy istnieje sposób, aby uniknąć plików nadpisywania”? W powyższym kodzie drugie "do" zwycięży nad pierwszym (może istnieć tylko jeden najwyższy poziom 'na'). Również 'do' i 'od' nigdy nie może być takie samo dla tego samego zadania kopiowania. –

+0

Nawet jeśli uruchomię to zadanie Gradle zastąpić plik do WebContent 'Rozpakuj zadań (typ: Copy) { \t duplicatesStrategy = DuplicatesStrategy.EXCLUDE \t z rootDir.getPath() + "/ tmp" \t do„WebContent " }' – carlitos081

+1

Widzę, co masz na myśli. 'DuplicatesStrategy' dotyczy duplikatów w źródłach kopii (' od'). Nie ma opcji konfiguracyjnej, aby powiedzieć zadanie "Kopiuj", aby nie nadpisywać plików, które już istnieją w katalogu docelowym, ale prawdopodobnie można to osiągnąć, używając 'eachFile'. Aby uzyskać szczegółowe informacje, zobacz 'Copy' w [Gradle Build Language Reference] (http://gradle.org/docs/current/dsl/index.html). Możesz również znaleźć pokrewną próbkę w katalogu 'samples' pobierania' gradle-all'. –

Odpowiedz

2

Zawsze można najpierw sprawdzić, czy plik istnieje w katalogu docelowym:

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

Przykładowe oparte na komentarz Piotra:

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

dalsze udoskonalenie odpowiedź BugOrFeature użytkownika. To za pomocą prostych ciągów dla zi do parametrów, wykorzystuje właściwość destinationDir w CopySpec by rozwiązać plik docelowy jest względna ścieżka do pliku:

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