2014-10-22 30 views
26

Tôi có một dự án gradle MultiModule mà tôi đang cố định cấu hình.Thực hiện nhiệm vụ gradle trên các dự án phụ

Root 
    projA 
    projB 
    other 
     projC 
     projD 
     projE 
     ... 

Muốn tôi có thể làm là có nhiệm vụ trong build.gradle gốc sẽ thực thi tác vụ buildJar trong mỗi dự án trong thư mục khác.

Tôi biết tôi có thể làm

configure(subprojects.findAll {it.name != 'tropicalFish'}) { 
    task hello << { task -> println "$task.project.name"} 
} 

Nhưng điều này cũng sẽ nhận được projA và projB, tôi chỉ muốn chạy các nhiệm vụ trên c, d, e ... Xin vui lòng cho tôi biết cách tốt nhất để đạt được điều này.

Trả lời

32

Không hoàn toàn chắc chắn bạn thuộc loại nào sau đây, nhưng chúng phải bao gồm các cơ sở của bạn.

1. Gọi nhiệm vụ trực tiếp

Bạn chỉ cần có thể gọi

gradle :other/projC:hello :other/projD:hello 

Tôi đã thử nghiệm này với:

# Root/build.gradle 
allprojects { 
    task hello << { task -> println "$task.project.name" } 
} 

# Root/settings.gradle 
include 'projA' 
include 'projB' 
include 'other/projC' 
include 'other/projD' 

2. Chỉ tạo nhiệm vụ trong các dự án phụ

Hoặc bạn chỉ muốn tác vụ được tạo trên các dự án/* khác?

Nếu sau này, sau đó các công việc sau:

# Root/build.gradle 
allprojects { 
    if (project.name.startsWith("other/")) { 
     task hello << { task -> println "$task.project.name" } 
    } 
} 

và sau đó có thể được gọi với:

$ gradle hello 
:other/projC:hello 
other/projC 
:other/projD:hello 
other/projD 

3. Tạo một nhiệm vụ chạy nhiệm vụ trong các tiểu dự án chỉ

Phiên bản này khớp với việc đọc câu hỏi của bạn có nghĩa là đã có một nhiệm vụ trong các tiểu dự án (buildJar) và tạo một tác vụ trong gốc mà sẽ chỉ gọi tiểu dự án khác/*: buildJar

allprojects { 
    task buildJar << { task -> println "$task.project.name" } 
    if (project.name.startsWith("other/")) { 
     task runBuildJar(dependsOn: buildJar) {} 
    } 
} 

Điều này tạo ra một nhiệm vụ "buildJar" trên tất cả các dự án, và "runBuildJar" trên/* các dự án khác mà thôi, vì vậy bạn có thể gọi:

$ gradle runBuildJar 
:other/projC:buildJar 
other/projC 
:other/projC:runBuildJar 
:other/projD:buildJar 
other/projD 
:other/projD:runBuildJar 

câu hỏi của bạn có thể được đọc nhiều cách khác nhau, hy vọng điều này bao gồm tất cả :)

+0

Cảm ơn cho câu trả lời. Không có tùy chọn nào phù hợp với nhu cầu của tôi: 1. Chúng tôi cần biết danh sách tất cả các tiểu dự án. 2 + 3. Xây dựng kịch bản cần phải được sửa đổi. Cuối cùng, tôi tìm thấy một cách khác để đạt được điều này và thêm nó như là một câu trả lời mới. – Marwin

+0

@Marwin: Câu trả lời của bạn ở đâu? Sẽ được quan tâm. – frhd

+0

@frhd Xem câu trả lời bên dưới của tôi 'gradle -p hello khác ' –

22

tôi thấy câu hỏi này ngày hôm nay bởi vì tôi có cùng một vấn đề. Tất cả các cách được đề cập bởi Mark có thể được sử dụng nhưng tất cả chúng đều có một số khuyết điểm. Vì vậy, tôi đang thêm một tùy chọn khác:

4.Chuyển đổi dự án hiện tại

gradle -p other hello 

này chuyển sang các "dự án hiện tại" và sau đó chạy tất cả các nhiệm vụ đặt tên hello thuộc dự án hiện tại.

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