2012-06-22 2 views
17

Tôi nhận được lỗigradle nhiệm vụ xây dựng đã tồn tại vấn đề

Cannot add task ':webserver:build' as a task with that name already exists. 

Điều lạ là nhiệm vụ hello của tôi là tốt, nhưng nhiệm vụ build tôi không phải là VÀ CÓ, tôi đang cố gắng để ghi đè xây dựng nhiệm vụ plugin Java.

Thạc sĩ build.gradle file:

allprojects { 
    apply plugin: 'java' 
    apply plugin: 'eclipse' 

    task hello << { task -> println "I'm $task.project.name" } 
    task build << { task -> println "I'm building now" } 
} 

subprojects { 

    hello << {println "- I depend on stserver"} 

    build << { println "source sets=$sourceSets.main.java.srcDirs" } 
} 

Con tôi webserver build.gradle file:

sourceSets.main{ 
    java.srcDirs = ['app'] 
} 

build << { println "source sets=$sourceSets.main.java.srcDirs" } 

hello << {println "- Do something specific xxxx"} 

thỏa thuận này là gì đây, là trọng build đặc biệt hoặc một cái gì đó? Ghi đè nhiệm vụ của riêng tôi hello hoạt động tốt và tôi nghĩ rằng việc ghi đè build sẽ đơn giản như vậy?

Trả lời

9

What is the deal here, overriding build is special or something. Overriding my own hello task worked fine and I thought overriding build would be just as simple?

Lý do hành vi dường như khác nhau là vì build nhiệm vụ đã tồn tại và hello không (và không phải vì build là đặc biệt).

Trong gradle bạn không thể làm điều này:

task hello << { print "hello" } 
task hello << { print "hello again" } 

này sẽ thất bại với lỗi quen thuộc: "Cannot add task ':hello' as a task with that name already exists.".

Vì nhiệm vụ build đã tồn tại, nên có một số task build << { ... } thứ hai. Tuy nhiên, nó sẽ hoạt động cho nhiệm vụ hello, vì nó không tồn tại và do đó task hello << { ... } là hợp pháp, vì đây là tuyên bố đầu tiên của nhiệm vụ hello.

Nếu bạn thay thế task build << { ... } bằng build << { ... }, chỉ thêm hành vi khác vào nhiệm vụ hiện tại, thao tác này sẽ "biên dịch" tiền phạt.

+0

heh, tôi đã thử điều đó và nó đã không hoạt động nhưng cuối cùng fonud ra có một nhiệm vụ xây dựng trong một tập tin gradle mà tôi đã bỏ lỡ ... sai lầm ngu ngốc của tôi. –

10

Bạn không ghi đè tác vụ hello, bạn chỉ cần thêm nhiều tác vụ tác vụ khác. Bạn có thể ghi đè tác vụ với task foo(overwrite: true). Tôi đã không đi qua một lý do chính đáng để ghi đè nhiệm vụ build; có thể có những cách tốt hơn để đạt được những gì bạn muốn.

+0

có lẽ nhưng bây giờ, tôi chỉ cần làm cho nó được thực hiện ... như tôi hiểu nó nhiều hơn, tôi chắc chắn sẽ cần phải xem lại một số công cụ. –

+0

@Peter Cảm ơn thực sự đã giúp. Overwirte thực sự hữu ích khi chúng ta đang xử lý nhiều tập tin kịch bản gradle. Ví dụ: Giả sử A.gradle có một số nhiệm vụ và nó được sử dụng trong (áp dụng từ: 'A.gradle') B.gradle và C.gradle. Bây giờ có một tập tin gradle khác nói rằng D.gradle cần cả hai tính năng B và C. Chúng tôi sẽ đối mặt với nhiệm vụ sao chép cho tất cả các nhiệm vụ được xác định trong A khi chúng tôi nhập nó. Và tôi cảm thấy tuyên bố ghi đè đúng sự thật cho các nhiệm vụ được xác định trong A.gradle sẽ là đúng đắn nên làm. Hoặc có một số cách giải quyết khác tồn tại mà tôi không biết. –