Android Studio dodaje zewnętrzny projekt do build.gradle

140

Mam przykładowy projekt z następującą konfiguracją:

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

Gdzie „ Projekt testowy ” jest zależny od „ Test Lib ”, a ostatni zależy od „ Czystej biblioteki Java ”. Kompilacja projektu i uruchomienie tej konfiguracji działa dobrze.

Myślę teraz o zaimportowaniu mojego poprzedniego obszaru roboczego Eclipse i pracy ze studiem Android, problem polega na tym, że konfiguracja projektu jest inna i chciałbym, aby tak zostało.

na przykład jeśli użyć poprzedniego przykładu:

/root
  + Android Test Lib
  + Android Test Project

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

Próbowałem wielu konfiguracji, ale nie znalazłem sposobu na odwołanie się do projektu poza zakresem folderu nadrzędnego ( w tym przypadku „ root ”).

Na wielu platformach / modułach możesz użyć znaku „..”, aby przejść w górę w folderach, ale to nie zadziałało, być może źle go użyłem.

Czy ktoś wie, jak można to osiągnąć dzięki Gradle?

AKTUALIZACJA

Postaram się być bardziej ogólny:

/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

Chciałbym użyć modułu 1 z projektami B , w project .


AKTUALIZACJA: 03.09.19

Widziałem to teraz i muszę zaktualizować ... po prawie 6 latach dziś jestem mądrzejszy iz całą pewnością mogę powiedzieć, że problemem było to, że źle zrozumiałem pojęcie „Źródła prawdy”.

Chociaż posiadanie jednego odnośnika do biblioteki jest fajnym pomysłem ... i może wydawać się "Źródłem prawdy", PRAWDZIWYM "Źródłem prawdy" byłaby wersja kodu używanego przez każdy projekt tej biblioteki, ponieważ Biblioteka sama w sobie ma wersje. Wiele wersji „Źródło prawdy” odnosi się do projektu, który korzysta z biblioteki.

Prawidłowym sposobem byłoby użycie tego, czego większość programistów nie lubi, czyli podmodułów git, i tak, powielanie źródeł w każdym projekcie, ponieważ większość projektów używa innej wersji kodu.

Musisz jednak dążyć do tego, aby wszystkie Twoje projekty korzystały z najnowszej i najlepszej wersji wszystkich Twoich bibliotek .. co samo w sobie jest wyzwaniem

Powodem, dla którego jest to właściwy sposób tworzenia projektu ze źródłami bibliotecznymi, jest to, że to skaluje ... możesz mieć setki projektów, każdy z własną konfiguracją biblioteki.

TacB0sS
źródło
4
Widzę, że to pytanie przykuwa uwagę ... Po bardzo ciężkich próbach zrezygnowałem ze studia na Androida, ponieważ złożoność konfiguracji, którą próbowałem skonstruować, była po prostu zbyt duża, a zbudowanie mojego ostatecznego projektu było wykonalne, ale bardzo niestabilny. z każdym uruchomieniem studia Android musiałem ponownie ustawiać parametry i ręcznie uruchamiać kompilację. minęło około dwóch miesięcy, odkąd się poddałem i mam nadzieję, że teraz jest lepiej!
TacB0sS
Podejście 2 tutaj wyjaśnia, jak to zrobić w bardzo łatwy sposób: stackoverflow.com/questions/25610727/ ...
Doron Ben-Ari

Odpowiedzi:

222

Zakładając, że Some Other Folder jest projektem gradle, możesz dodać coś podobnego do następującego pliku settings.gradle:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
Ethan
źródło
1
SomeOtherFolder wskazuje na folder projektu, w którym znajdują się moduły, które jestem zainteresowany dodaniem jako moduły do ​​projektu Android Lib
TacB0sS
Katalog ustawień wskazuje na „root”. Muszę przejść poziom wyżej, do innego modułu w innym projekcie.
TacB0sS
czy mógłbyś dodać później moduły podrzędne? include ': someOtherFolder: proj1'
Ethan,
1
zaktualizowany o kilka szczegółów. settings.gradle powinno znajdować się w / Project A
Ethan
5
Świetna odpowiedź. W AS 1.0.2 musiałem również wykonać następujące czynności: Kliknij prawym przyciskiem moduł -> Otwórz ustawienia modułu -> Zależności -> + (na dole), wybierz Zależności modułu, wybierz swoją bibliotekę z listy, kliknij ok :)
T. Coutlakis
49

Musisz umieścić w swoim pliku settings.gradle te linie:

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

Następnie musisz dodać do swojego builde.gradle (Module: app) w drzewie zależności , następującą linię:

implementation project(':module2')

lub przejdź do Struktura projektu > aplikacja > Zależności , kliknij Dodaj , wybierz 3 Zależności modułów i wybierz swój moduł

Dario Brux
źródło
1
Jeśli masz problemy z odwołaniem się do klas biblioteki z głównej aplikacji, dzieje się tak, ponieważ biblioteka prawdopodobnie występuje w różnych wariantach. Tak, wystarczy określić zależność we właściwy sposób: compile project(path: ':library', configuration: 'variant'). Tutaj variantskłada się z pliku biblioteki flavori buildTypezgodnie z definicją w nim build.gradle. Na przykład, jeśli chcesz mieć releasetyp kompilacji biblioteki w developsmaku, to variantjest developRelease.
Sevastyan Savanyuk
9

W przypadku Gradle 1.10 (nie wiem, do jakich innych wersji to będzie obowiązywać) oto, co wymyśliłem na podstawie odpowiedzi podanej tutaj http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

Mam projekt biblioteki API, wspólny projekt biblioteki i główny projekt aplikacji. Każdy jest samodzielnym projektem programistycznym, a dwie biblioteki mają być współużytkowane przez wiele aplikacji.

W settings.gradle dla wspólnego projektu:

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

Następnie w głównym projekcie aplikacji settings.gradle:

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'

W każdym z odpowiednich plików build.gradle odwołujesz się do nich, używając nazwy nadanej im w ustawieniach.createProjectDescriptor, tak jak w przypadku każdej innej zależności projektu:

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

To wydaje się działać. Podejrzewam, że nie zgłosił on nawet błędu dla wielu plików DEX definiujących bibliotekę api, jak podejrzewam, ponieważ wszystko to było częścią tego samego procesu budowania, a Gradle był wystarczająco inteligentny, aby to wszystko rozgryźć.

alphonzo79
źródło
2
Wciąż próbuję, ale problem polega na tym, że zależności w odpowiedniej bibliotece wydają się nigdy nie ładować. Więc jeśli mam otwartą tylko bibliotekę, wydaje się w porządku, ale kiedy próbuję ją z poziomu głównej aplikacji, pojawia się komunikat, że brakuje wszystkich zaimportowanych bibliotek.
Czechnology
@Czechnology Miał ten sam problem. Rozwiązałem to. Zobacz mój komentarz dotyczący tej odpowiedzi: stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk
9

Kliknij prawym przyciskiem myszy projekt - Wybierz „Otwórz ustawienia modułu” - Wybierz „Moduły” w lewym panelu - Kliknij symbol „+” u góry - Wybierz „Importuj moduł”.

Po zaimportowaniu Module. Musisz dodać go jako zależność dla bieżącego projektu.

Pozostaw zaznaczone "Moduły" w lewym panelu i kliknij swój projekt - Teraz przejdź do zakładki zależności i kliknij symbol "+" znajdujący się na dole - Wybierz trzecią opcję "Zależności modułów" i jeśli poprawnie zaimportowałeś swój projekt, pokazuje wszystkie dostępne moduły, które można dodać jako zależność do bieżącego projektu.

Varundroid
źródło
To prawie działa ... projektu nie można zbudować, ponieważ dane wyjściowe modułu zależności nie są dodawane do pliku build.gradle, co jest dokładnie moim pierwotnym problemem.
TacB0sS
Myślę, że w przypadku gradle musisz umieścić wszystkie projekty w tym samym folderze głównym. Spróbuj tego. Umieść projekt, który chcesz dodać jako zależność, w tym samym folderze co bieżący projekt.
Varundroid,
Tego nikt nie chce robić poza bankomatem. Jeśli chcesz pracować z Android Studio, to jest sposób, aby wszystko działało. Innym alternatywnym sposobem, który podążam, jest utworzenie projektu w Intellij, ustawianie wszystkich zależności, a następnie importowanie tego projektu do Android Studio, robiąc to, zmuszając Android Studio do używania systemu kompilacji Ant zamiast Gradle. Mam nadzieję, że to pomoże. Twoje zdrowie!!
Varundroid,
1
@Varundroid, rozwiązaniem jest najpierw zaimportowanie odwołania do autonomicznej biblioteki przy użyciu odpowiedzi Ethana. Następnie dodaj moduł do zależności głównej aplikacji, używając swojej odpowiedzi. Umożliwia to odwoływanie się do tej samej biblioteki w wielu aplikacjach bez konieczności duplikowania kodu biblioteki.
bcorso
1

Ponownie zadaję to pytanie w sposób, który pociąga za sobą zamiary oryginalnych plakatów w Jak odnosimy się do niestandardowych bibliotek Androida i Java żyjących poza katalogiem naszego głównego projektu Android?

Tam odpowiadam na własne pytanie. Zasadniczo moja odpowiedź wykorzystuje wgląd w kodowanie stopni @ Ethan (autor wybranej odpowiedzi w bieżącym wątku). Ale moja odpowiedź omija również inne problemy i przedstawia szczegółowy przykład krok po kroku.

John Bentley
źródło
-1

Jak powiedział Ethan, jeśli dodasz to do swoich settings.gradle, doda to zewnętrzny projekt do Android Studio (w tym przykładzie znajduje się w folderze nadrzędnym):

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

Następnie, aby dodać go jako zależność jednego z twoich projektów, po prostu dodaj go w build.gradle tego projektu jako kolejną zależność, taką jak ta (możesz to również zrobić graficznie, jak tutaj ):

compile project(':../ProjectB/:module1')
Yair Kukielka
źródło