Apa perbedaan antara semua proyek dan subproyek

124

Pada build gradle multiproyek, dapatkah seseorang memberi tahu saya apa sebenarnya perbedaan antara bagian "allprojects" dan "subprojects"? Hanya direktori induk? Apakah ada yang menggunakan keduanya? Jika ya, apakah Anda memiliki aturan umum yang menentukan apa yang biasanya diterapkan di setiap aturan?

Pertanyaan terkait: apa perbedaan antara kedua sintaks (sebenarnya untuk semua proyek DAN subproyek):

subprojects {  ...
}

dan

configure(subprojects) { ...
}

Kapan Anda akan salah satu dari yang lain?

JoeG
sumber

Jawaban:

119

Dalam build gradle multi-project, Anda memiliki rootProject dan subproyek. Kombinasi keduanya adalah semua proyek. RootProject adalah tempat build dimulai. Pola yang umum adalah rootProject tidak memiliki kode dan subproyeknya adalah proyek java. Dalam hal ini, Anda menerapkan plugin java hanya ke subproyek:

subprojects {
    apply plugin: 'java'
} 

Ini akan sama dengan proyek pom agregat maven yang hanya membangun sub-modul.

Mengenai dua sintaksis, keduanya melakukan hal yang persis sama. Yang pertama terlihat lebih baik.

Justin Ryan
sumber
Saya mencoba memahami jawaban Anda, dan mengapa orang ingin "rootProject tidak memiliki kode"?
Marian Paździoch
6
Itu dapat memiliki kode tetapi sebagian besar waktu itu hanya untuk menggabungkan semua sub proyek di bawah satu proyek root.
mallaudin
44

Menambah jawaban Ryan, configuremetode menjadi penting ketika Anda ingin mengkonfigurasi subset objek kustom. Misalnya configure([project(":foo"), project(":bar")]) { ... }atau configure(tasks.matching { it.name.contains("foo") }) { ... }.

Kapan menggunakan allprojectsvs. subprojectstergantung pada keadaan. Seringkali Anda akan menggunakan keduanya. Misalnya, plugin terkait kode seperti plugin Java biasanya diterapkan subprojects, karena dalam banyak build, project root tidak berisi kode apa pun. Plugin Eclipse dan IDEA, di sisi lain, biasanya diterapkan ke allprojects. Jika ragu, lihat contoh dan build dan / atau eksperimen lainnya. Tujuan umumnya adalah untuk menghindari konfigurasi yang tidak relevan. Dalam hal ini, subprojectslebih baik daripada allprojectsasalkan memberikan hasil yang diharapkan.

Peter Niederwieser
sumber
bagaimana jika beberapa sub proyek saya bergantung pada buffer protokol? haruskah saya menerapkan proto-gradle-plugin di semua? atau sub atau hanya untuk beberapa proyek di sub?
pengguna1870400