2014-12-04 19 views
5

Có cách nào để tránh ghi đè tệp khi sử dụng tác vụ type:Copy không?Sao chép bản sao mà không ghi đè

Đây là nhiệm vụ của tôi:

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

Tôi muốn tránh để xác định tất cả các file sử dụng loại trừ 'tập tin/file *'.

Dường như duplicatesStrategy= DuplicatesStrategy.EXCLUDE không hoạt động. Tôi đọc về một vấn đề trên gradle 0.9 nhưng tôi đang sử dụng Gradle 2.1.

Vấn đề này vẫn còn ở đó?

Hoặc tôi có hiểu nhầm cách tác vụ này nên được sử dụng đúng cách không?

Cảm ơn

+0

Chính xác của bạn là gì? Có cách nào để tránh ghi đè tệp không? Trong đoạn mã trên, 'thành' thứ hai sẽ giành chiến thắng trước tiên (có thể chỉ là một cấp cao nhất' vào'). Ngoài ra, 'vào' và' từ' không bao giờ có thể giống nhau cho cùng một tác vụ Sao chép. –

+0

Thậm chí nếu tôi chạy nhiệm vụ này Gradle ghi đè lên tập tin vào WebContent 'nhiệm vụ giải nén (loại: Sao chép) { \t duplicatesStrategy = DuplicatesStrategy.EXCLUDE \t từ rootDir.getPath() + "/ tmp" \t vào "WebContent " }' – carlitos081

+1

Tôi hiểu ý của bạn là gì. 'DuplicatesStrategy' là về các bản sao trong các nguồn bản sao (' from'). Không có tùy chọn cấu hình để nói một tác vụ 'Sao chép' không ghi đè lên các tệp đã tồn tại trong thư mục đích, nhưng bạn có thể đạt được điều này bằng cách sử dụng' eachFile'. Xem “Sao chép” trong [Tham khảo Ngôn ngữ Xây dựng Gradle] (http://gradle.org/docs/current/dsl/index.html) để biết chi tiết. Bạn cũng có thể tìm thấy một mẫu liên quan trong thư mục 'samples' của bản tải xuống' gradle-all'. –

Trả lời

2

Bạn luôn có thể kiểm tra đầu tiên nếu tập tin tồn tại trong thư mục đích:

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

mẫu dựa trên nhận xét Phêrô:

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

Một tinh tế hơn của câu trả lời BugOrFeature của. Nó sử dụng các chuỗi đơn giản cho tham số từ và vào, sử dụng thuộc tính destinationDir của tệp CopySpec để giải quyết đường dẫn tương đối của tệp đích đến Tệp:

task ensureLocalTestProperties(type: Copy) { 
    from zipTree('/app-war/app.war') 
    into 'WebContent' 
    eachFile { 
     if (it.relativePath.getFile(destinationDir).exists()) { 
      it.exclude() 
     } 
    } 
} 
Các vấn đề liên quan