2012-06-22 45 views
10

Khi áp dụng một cấu trúc đa gradle dự án để dự án của chúng tôi, settings.gradle trông như thế này của tôi:dự án đa Gradle xây dựng với các dự án có sản phẩm nào

include "source:compA:api" 
include "source:compA:core" 
include "source:compB" 

dự án gradle cho tôi

Root project 'tmp' 
\--- Project ':source' 
    +--- Project ':source:compA' 
    | +--- Project ':source:compA:api' 
    | \--- Project ':source:compA:core' 
    \--- Project ':source:compB' 

Đây chính là cấu trúc thư mục!
Trong thư mục gốc của tôi, tôi có một build.gradle áp dụng các plugin java cho tất cả các tiểu dự án:

subprojects { 
    apply plugin: 'java' 
} 

Khi xây dựng tôi kết thúc có hiện vật cho : Nguồn: Compa đó là trống rỗng, vì đây là thực sự không phải dự án chỉ là các thư mục con apicore là các dự án java phù hợp.

Làm cách nào tốt nhất để tránh có đồ tạo tác trống?

+0

Tại sao bạn không chỉ áp dụng plugin Java cho api và lõi trong tập lệnh tương ứng? –

+0

Tôi có thể làm điều đó, nhưng cấu trúc dự án thực tế của tôi được lồng ghép nhiều hơn, với rất nhiều dự án. Tôi nghĩ đây là vấn đề thường gặp đối với cấu trúc dự án kế thừa. Và tôi đang tìm một giải pháp linh hoạt, trong đó mỗi dự án không cần biết nhiều về quá trình xây dựng mà nó sống. – VolkerK

+0

IMHO mô-đun con nên biết rõ ràng rằng nó là một dự án Java. Điều này sẽ làm cho nó trở nên rõ ràng hơn cho bất kỳ ai nhìn vào nó hơn là khai báo thông tin này ở cấp cơ sở. –

Trả lời

14

Bạn có thể thử sử dụng mẹo mà họ sử dụng trong Gradle's own settings.gradle tệp. Lưu ý cách mỗi dự án phụ nằm trong thư mục 'subprojects/${projectName}', nhưng chính thư mục subprojects không phải là một dự án.

Vì vậy, trong trường hợp của bạn, bạn muốn làm điều gì đó như:

include "source:compA-api" 
include "source:compA-core" 
include "source:compB" 

project(':source:compA-api').projectDir = new File(settingsDir, 'source/compA/api') 
project(':source:compA-core').projectDir = new File(settingsDir, 'source/compA/core') 

Tôi đã cố ý bỏ qua ruột kết giữa compAapi để đảm bảo source:compA không được đánh giá là một container dự án.

Ngoài ra, bạn có thể thử trừ các dự án source:compA từ có plugin java áp dụng cho nó, bằng cách làm một cái gì đó như:

def javaProjects() { 
    return subprojects.findAll { it.name != 'compA' } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 

Edit: Hoặc bạn có thể thử một cái gì đó như thế này (điều chỉnh để bạn thích):

def javaProjects() { 
    return subprojects.findAll { new File(it.projectDir, "src").exists() } 
} 

configure(javaProjects()) { 
    apply plugin: 'java' 
} 
+0

Cảm ơn bạn đã trả lời. Tôi đã hy vọng cho một cái gì đó giống như một thiết lập 'skipIfEmpty'. – VolkerK

+0

Bạn có thể đạt được một cái gì đó tương đương với điều đó bằng cách tùy chỉnh mệnh đề 'findAll'. Xem chỉnh sửa ở trên. – rodion

+0

Đó là một giải pháp tốt. Tôi vẫn phải làm quen với thực tế là các buildfiles là các kịch bản có tính hấp dẫn;) – VolkerK

Các vấn đề liên quan