Android studio menambahkan proyek eksternal ke build.gradle

139

Saya punya proyek sampel, dengan pengaturan berikut:

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

Di mana ' Proyek Uji ' bergantung pada ' Tes Lib ', dan yang terakhir tergantung pada ' Lib Jawa Murni ' Mengkompilasi proyek dan meluncurkan pengaturan ini berfungsi dengan baik.

Saya sekarang berpikir tentang mengimpor ruang kerja Eclipse saya sebelumnya dan bekerja dengan Android studio, masalahnya adalah pengaturan proyek berbeda, dan saya ingin tetap seperti ini.

misalnya jika menggunakan contoh sebelumnya:

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

Saya sudah mencoba banyak konfigurasi, tetapi saya tidak menemukan cara untuk referensi proyek di luar lingkup folder induk (' root ' dalam contoh kasus).

Di banyak platform / modul Anda dapat menggunakan '..' untuk naik ke folder tetapi ini tidak berhasil untuk saya, mungkin saya salah menggunakannya.

Adakah yang tahu bagaimana ini bisa dicapai dengan Gradle?

MEMPERBARUI

Saya akan mencoba menjadi lebih umum:

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

Saya ingin menggunakan Modul 1 dari proyek B , dalam proyek A .


UPDATE: 09-03-19

Saya melihat ini sekarang dan saya harus memperbarui ... setelah hampir 6 tahun, hari ini saya lebih bijaksana, dan saya pasti bisa mengatakan masalahnya adalah saya salah memahami konsep "Sumber kebenaran".

Walaupun memiliki satu referensi ke perpustakaan adalah konsep yang bagus .. dan mungkin tampak seperti "Sumber kebenaran", "Sumber kebenaran" NYATA akan menjadi versi kode yang digunakan setiap proyek dari perpustakaan itu, karena perpustakaan dengan sendirinya memiliki versi .. banyak versi dan "Sumber kebenaran" relatif terhadap proyek yang menggunakan perpustakaan.

Cara yang benar adalah dengan menggunakan apa yang sebagian besar pengembang tidak suka, dan itu adalah git submodules, dan ya menduplikasi sumber di setiap proyek menyebabkan kemungkinan besar setiap proyek menggunakan versi kode yang berbeda.

Namun Anda perlu mengarahkan semua proyek Anda untuk menggunakan versi terbaru dan terhebat dari semua perpustakaan Anda .. yang merupakan tantangan dengan sendirinya

Alasannya adalah cara yang tepat untuk mengembangkan proyek dengan sumber pustaka adalah bahwa skala ini ... Anda dapat memiliki ratusan proyek masing-masing dengan konfigurasi pustaka sendiri.

TacB0sS
sumber
4
Saya melihat pertanyaan ini mendapat perhatian ... Setelah berusaha sangat keras, saya menyerah di Android studio untuk saat ini, karena kompleksitas pengaturan yang saya coba buat terlalu banyak, dan membangun proyek akhir saya bisa dilakukan, tapi sangat tidak stabil. dengan setiap peluncuran studio Android saya harus menetapkan beberapa parameter lagi, dan secara manual menyebabkan build berfungsi. sudah sekitar dua bulan sejak saya menyerah, dan saya berharap semuanya lebih baik sekarang!
TacB0sS
Pendekatan 2 di sini menjelaskan cara melakukan ini dengan sangat mudah: stackoverflow.com/questions/25610727/…
Doron Ben-Ari

Jawaban:

222

Dengan asumsi bahwa Some Other Folder adalah proyek gradle, Anda dapat menambahkan sesuatu seperti berikut ini ke file settings.gradle Anda:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
Ethan
sumber
1
The someOtherFolder menunjuk ke folder proyek dan di dalamnya ada modul, yang saya tertarik untuk ditambahkan sebagai modul untuk proyek Android Lib
TacB0sS
Pengaturan dir menunjuk ke 'root' saya harus mendapatkan level yang lebih tinggi, ke modul lain di proyek lain.
TacB0sS
Bisakah Anda menambahkan submodul setelah itu? termasuk ': someOtherFolder: proj1'
Ethan
1
diperbarui dengan beberapa detail. settings.gradle harus di / Proyek A
Ethan
5
Jawaban yang bagus Di AS 1.0.2, saya juga perlu melakukan yang berikut: Klik kanan modul -> Buka Pengaturan Modul -> Ketergantungan -> + (bawah), pilih Ketergantungan Modul, pilih perpustakaan Anda dari daftar, klik ok :)
T. Coutlakis
49

Anda harus memasukkan pengaturan file Anda. Ketahui baris ini:

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

Maka Anda harus menambahkan di builde.gradle Anda (Modul: aplikasi) di pohon dependensi , baris ini:

implementation project(':module2')

atau masuk ke Struktur Proyek > aplikasi > Ketergantungan , klik Tambah , pilih 3 Ketergantungan Modul dan pilih modul Anda

Dario Brux
sumber
1
Jika Anda memiliki masalah dengan mereferensikan kelas perpustakaan dari aplikasi utama, ini karena perpustakaan mungkin datang dalam varian yang berbeda. Jadi, hanya menentukan ketergantungan dengan cara yang tepat: compile project(path: ':library', configuration: 'variant'). Di sini, variantterdiri dari flavordan buildTypesebagaimana ditentukan oleh file perpustakaan build.gradle. Misalnya, jika Anda ingin releasemembuat tipe perpustakaan dalam developrasa, maka variantadalah developRelease.
Sevastyan Savanyuk
9

Dengan Gradle 1.10 (tidak tahu versi apa yang akan valid untuk ini) inilah yang saya buat berdasarkan respons yang diberikan di sini http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

Saya memiliki proyek perpustakaan api, proyek perpustakaan umum dan proyek aplikasi utama. Masing-masing adalah proyek pengembangan yang berdiri sendiri dan kedua perpustakaan dimaksudkan untuk dibagikan di antara beberapa aplikasi.

Dalam settings.gradle untuk proyek umum:

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

Kemudian di setting.gradle proyek aplikasi utama:

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

Di masing-masing file build.gradle masing-masing, Anda hanya merujuknya dengan nama yang Anda berikan di settings.createProjectDescriptor seperti Anda bergantung pada proyek lainnya:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

Ini sepertinya berhasil. Bahkan tidak membuat kesalahan untuk beberapa file DEX mendefinisikan perpustakaan api, saya curiga karena itu semua adalah bagian dari proses build yang sama dan Gradle cukup pintar untuk memahaminya.

alphonzo79
sumber
2
Saya terus mencoba ini tetapi masalahnya adalah bahwa dependensi di perpustakaan masing-masing tampaknya tidak pernah dimuat. Jadi jika saya baru saja membuka perpustakaan tampaknya baik-baik saja tetapi ketika saya mencobanya dari aplikasi utama, ia mengatakan semua perpustakaan yang diimpor hilang.
Czechnology
@Czechnology Punya masalah yang sama. Selesaikan itu. Lihat komentar saya untuk jawaban ini: stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk
9

Klik kanan pada proyek - Pilih "Buka Pengaturan Modul" - Pilih "Modul" di panel kiri - Klik pada simbol "+" di atas - Pilih "Impor Modul".

Setelah mengimpor Modul. Anda perlu menambahkannya sebagai ketergantungan untuk proyek Anda saat ini.

Tetap "Modul" Dipilih di panel kiri dan klik pada proyek Anda - Sekarang Masuk dalam tab dependensi dan klik pada simbol "+" yang terletak di bagian bawah - Pilih opsi ketiga "Ketergantungan Modul" dan jika Anda telah mengimpor proyek Anda dengan benar, itu akan menunjukkan kepada Anda semua modul yang tersedia yang dapat ditambahkan sebagai ketergantungan pada proyek Anda saat ini.

Varundroid
sumber
Ini hampir berhasil ... proyek tidak dapat dibangun karena output dari modul dependensi tidak ditambahkan ke file build.gradle, yang merupakan masalah asli saya.
TacB0sS
Saya pikir dengan gradle, Anda harus meletakkan semua proyek di folder root yang sama. Coba itu. Masukkan proyek yang ingin Anda tambahkan sebagai dependensi dalam folder yang sama dengan proyek Anda saat ini.
Varundroid
Inilah yang tidak ingin dilakukan siapa pun selain ATM jika Anda ingin bekerja dengan Android Studio, ini adalah cara untuk membuat berbagai hal bekerja. Cara alternatif lain yang saya ikuti adalah, saya membuat proyek di Intellij mengatur semua dependensi dan kemudian mengimpor proyek itu ke Android studio, dengan melakukan ini saya memaksa Android Studio untuk menggunakan sistem semut bangunan daripada Gradle. Semoga ini bisa membantu. Bersulang!!
Varundroid
1
@ Varundroid, solusinya adalah pertama-tama mengimpor referensi ke perpustakaan yang berdiri sendiri menggunakan jawaban Ethan. Kemudian tambahkan modul ke dependensi aplikasi utama menggunakan jawaban Anda. Ini memungkinkan Anda untuk merujuk pustaka yang sama di beberapa aplikasi tanpa harus menduplikasi kode pustaka.
bcorso
1

Saya mengajukan kembali pertanyaan ini dengan cara yang mencakup maksud poster asli di Bagaimana cara mereferensikan Perpustakaan Android dan Java khusus yang tinggal di luar direktori Proyek Android Utama kami?

Di sana saya menjawab pertanyaan saya sendiri. Pada intinya jawaban saya menggunakan @ Ethan's (penulis jawaban yang dipilih di utas saat ini) grading coding. Tetapi jawaban saya juga menavigasi beberapa gotcha lainnya dan memberikan contoh langkah demi langkah yang terperinci.

John Bentley
sumber
-1

Seperti yang dikatakan Ethan, jika Anda menambahkan ini ke settings.gradle Anda, itu akan menambahkan proyek eksternal ke Android Studio (dalam contoh ini, ada di folder induk):

project(':../ProjectB/:module1')

Kemudian, untuk menambahkannya sebagai dependensi dari salah satu proyek Anda, tambahkan saja di build.gradle dari proyek itu sebagai dependensi lain seperti ini (Anda juga dapat melakukannya secara grafis seperti di sini ):

compile project(':../ProjectB/:module1')
Yair Kukielka
sumber