Android Studio fügt externes Projekt zu build.gradle hinzu

139

Ich habe ein Beispielprojekt mit folgendem Setup:

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

Wo das ' Testprojekt ' von der ' Testbibliothek ' abhängt und das letzte von der ' Pure Java Lib ' abhängt Das Kompilieren des Projekts und das Starten dieses Setups funktioniert einwandfrei.

Ich denke jetzt darüber nach, meinen vorherigen Eclipse-Arbeitsbereich zu importieren und mit Android Studio zu arbeiten. Das Problem ist, dass das Projekt-Setup anders ist, und ich möchte es so lassen.

Zum Beispiel, wenn Sie das vorherige Beispiel verwenden möchten:

/root
  + Android Test Lib
  + Android Test Project

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

Ich habe viele Konfigurationen ausprobiert, aber keine Möglichkeit gefunden, auf ein Projekt außerhalb des Bereichs des übergeordneten Ordners zu verweisen ( im Beispielfall ' root ').

In vielen Plattformen / Modulen können Sie das '..' verwenden, um in den Ordnern nach oben zu gelangen, aber das hat bei mir nicht funktioniert, vielleicht habe ich es falsch verwendet.

Weiß jemand, wie dies mit Gradle erreicht werden kann?

AKTUALISIEREN

Ich werde versuchen, allgemeiner zu sein:

/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

Ich mag Modul 1 von verwenden Projekt B , in Projekt A .


UPDATE: 09-03-19

Ich habe das jetzt gesehen und ich muss es aktualisieren ... nach fast 6 Jahren bin ich heute weiser und ich kann definitiv sagen, dass das Problem darin bestand, dass ich das Konzept der "Quelle der Wahrheit" falsch verstanden habe.

Während es ein schönes Konzept ist, einen Verweis auf eine Bibliothek zu haben, und vielleicht als "Quelle der Wahrheit" erscheint, wäre die ECHTE "Quelle der Wahrheit" die Version des Codes, den jedes Projekt von dieser Bibliothek verwendet Die Bibliothek selbst hat Versionen. Viele Versionen und die "Quelle der Wahrheit" beziehen sich auf das Projekt, das die Bibliothek verwendet.

Der richtige Weg wäre, das zu verwenden, was die meisten Entwickler nicht mögen, und das sind Git-Submodule, und ja, die Quellen in jedem Projekt zu duplizieren, verursacht die meisten Chancen, dass jedes Projekt eine andere Version des Codes verwendet.

Sie müssten jedoch darauf abzielen, dass alle Ihre Projekte die neueste und beste Version aller Ihrer Bibliotheken verwenden. Dies ist eine Herausforderung für sich

Der Grund, warum dies der richtige Weg ist, um ein Projekt mit Bibliotheksquellen zu entwickeln, ist, dass dies skaliert ... Sie können Hunderte von Projekten mit jeweils einer eigenen Bibliothekskonfiguration haben.

TacB0sS
quelle
4
Ich sehe, dass diese Frage einige Aufmerksamkeit erhält ... Nachdem ich mich wirklich sehr bemüht hatte, gab ich das Android-Studio vorerst auf, da die Komplexität des Setups, das ich zu konstruieren versuchte, einfach zu groß war und das Erstellen meines endgültigen Projekts machbar war. aber sehr instabil. Bei jedem Start des Android-Studios musste ich einige Parameter erneut einstellen und den Build manuell zum Laufen bringen. Es ist ungefähr zwei Monate her, seit ich aufgegeben habe, und ich hoffe, dass es jetzt besser wird!
TacB0sS
Ansatz 2 hier erklärt, wie dies sehr einfach zu tun ist: stackoverflow.com/questions/25610727/…
Doron Ben-Ari

Antworten:

222

Angenommen, ein anderer Ordner ist ein Gradle-Projekt, können Sie Ihrer settings.gradle-Datei Folgendes hinzufügen:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
Ethan
quelle
1
Der someOtherFolder zeigt auf einen Projektordner und darin befinden sich Module, die ich als Module zum Android Lib-Projekt
hinzufügen möchte
Das Einstellungsverzeichnis zeigt auf 'root'. Ich muss eine höhere Ebene erreichen, auf ein anderes Modul in einem anderen Projekt.
TacB0sS
Könnten Sie die Submodule danach hinzufügen? include ': someOtherFolder: proj1'
Ethan
1
mit einigen Details aktualisiert. settings.gradle sollte in / Projekt A
Ethan
5
Gute Antwort. In AS 1.0.2 musste ich außerdem Folgendes tun: Rechtsklick auf Modul -> Moduleinstellungen öffnen -> Abhängigkeiten -> + (unten), Modulabhängigkeit auswählen, Bibliothek aus der Liste auswählen, auf OK klicken :)
T. Coutlakis
49

Sie müssen in Ihre Datei settings.gradle diese Zeilen eingeben:

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

Dann müssen Sie in Ihrem builde.gradle (Modul: App) im Abhängigkeitsbaum diese Zeile hinzufügen :

implementation project(':module2')

oder gehen Sie in die Projektstruktur > App > Abhängigkeiten , klicken Sie auf Hinzufügen , wählen Sie 3 Modulabhängigkeiten und wählen Sie Ihr Modul aus

Dario Brux
quelle
1
Wenn Sie Probleme haben, die Klassen der Bibliothek über die Haupt-App zu referenzieren, liegt dies daran, dass die Bibliothek wahrscheinlich in verschiedenen Varianten erhältlich ist. Geben Sie einfach die Abhängigkeit richtig an : compile project(path: ':library', configuration: 'variant'). Hier variantbesteht aus flavorund buildTypewie durch die build.gradleDatei der Bibliothek definiert . Zum Beispiel, wenn Sie wollen releaseBuildtyp der Bibliothek in einem developGeschmack, dann variantist developRelease.
Sevastyan Savanyuk
9

Mit Gradle 1.10 (ich weiß nicht, für welche anderen Versionen dies gültig sein wird) habe ich mir dies aufgrund einer hier gegebenen Antwort ausgedacht: http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

Ich habe ein API-Bibliotheksprojekt, ein gemeinsames Bibliotheksprojekt und das Haupt-App-Projekt. Jedes ist ein eigenständiges Entwicklungsprojekt und die beiden Bibliotheken sollen von mehreren Apps gemeinsam genutzt werden.

In settings.gradle für das allgemeine Projekt:

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

Dann in der Haupt-App Projekteinstellungen.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'

In jeder der jeweiligen build.gradle-Dateien verweisen Sie einfach auf den Namen, den Sie in den settings.createProjectDescriptor angegeben haben, wie bei jeder anderen Projektabhängigkeit:

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

Das scheint zu funktionieren. Es wurde nicht einmal ein Fehler für mehrere DEX-Dateien ausgegeben, die die API-Bibliothek definieren. Ich vermute, dass dies alles Teil desselben Erstellungsprozesses war und Gradle klug genug war, um alles herauszufinden.

alphonzo79
quelle
2
Ich versuche es weiter, aber das Problem ist, dass die Abhängigkeiten in der jeweiligen Bibliothek scheinbar nie geladen werden. Wenn ich also nur die Bibliothek geöffnet habe, scheint es in Ordnung zu sein, aber wenn ich es über die Haupt-App versuche, heißt es, dass alle importierten Bibliotheken fehlen.
Czechnology
@Czechnology hatte das gleiche Problem. Ich habe es gelöst. Siehe meinen Kommentar für diese Antwort: stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk
9

Klicken Sie mit der rechten Maustaste auf das Projekt - Wählen Sie "Moduleinstellungen öffnen" - Wählen Sie im linken Bereich "Module" aus - Klicken Sie oben auf das Symbol "+" - Wählen Sie "Modul importieren".

Nach dem Importieren des Moduls. Sie müssen es als Abhängigkeit für Ihr aktuelles Projekt hinzufügen.

Lassen Sie "Module" im linken Bereich ausgewählt und klicken Sie auf Ihr Projekt. - Gehen Sie jetzt in die Registerkarte "Abhängigkeiten" und klicken Sie auf das Symbol "+" unten. - Wählen Sie die dritte Option "Modulabhängigkeiten". Wenn Sie Ihr Projekt korrekt importiert haben, wird es Zeigen Sie das gesamte verfügbare Modul an, das als Abhängigkeit zu Ihrem aktuellen Projekt hinzugefügt werden kann.

Varundroid
quelle
Das funktioniert fast ... das Projekt kann nicht erstellt werden, da die Ausgabe des Abhängigkeitsmoduls nicht zur Datei build.gradle hinzugefügt wird, was genau mein ursprüngliches Problem ist.
TacB0sS
Ich denke, mit gradle müssen Sie alle Projekte im selben Stammordner ablegen. Versuch das. Legen Sie das Projekt, das Sie als Abhängigkeit hinzufügen möchten, im selben Ordner wie Ihr aktuelles Projekt ab.
Varundroid
Dies ist, was niemand außer ATM tun möchte, wenn Sie mit Android Studio arbeiten möchten, ist dies der Weg, um Dinge zum Laufen zu bringen. Eine andere Alternative, der ich folge, ist, ein Projekt in Intellij zu erstellen, alle Abhängigkeiten einzurichten und dieses Projekt dann in Android Studio zu importieren. Auf diese Weise zwinge ich Android Studio, ein Ant-Build-System anstelle von Gradle zu verwenden. Ich hoffe es hilft. Prost!!
Varundroid
1
@ Varundroid, die Lösung besteht darin, zuerst einen Verweis auf die eigenständige Bibliothek mit Ethans Antwort zu importieren. Fügen Sie dann das Modul mithilfe Ihrer Antwort zu den Abhängigkeiten der Haupt-App hinzu. Auf diese Weise können Sie in mehreren Apps auf dieselbe Bibliothek verweisen, ohne den Bibliothekscode duplizieren zu müssen.
Bcorso
1

Ich stelle diese Frage auf eine Weise erneut, die die Absichten der Originalplakate unter Wie verweisen wir auf benutzerdefinierte Android- und Java-Bibliotheken, die sich außerhalb des Verzeichnisses unseres Haupt-Android-Projekts befinden?

Dort beantworte ich meine eigene Frage. Im Kern verwendet meine Antwort @ Ethans (den Autor der ausgewählten Antwort im aktuellen Thread) Gradle-Coding-Einblick. Meine Antwort navigiert aber auch durch einige andere Fallstricke und enthält ein detailliertes Schritt-für-Schritt-Beispiel.

John Bentley
quelle
-1

Wie Ethan sagte, wird beim Hinzufügen zu Ihrem settings.gradle ein externes Projekt zu Android Studio hinzugefügt (in diesem Beispiel befindet es sich im übergeordneten Ordner):

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

Um es dann als Abhängigkeit von einem Ihrer Projekte hinzuzufügen, fügen Sie es einfach im build.gradle dieses Projekts als eine andere Abhängigkeit wie diese hinzu (Sie können es auch grafisch wie hier ausführen ):

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