Le studio Android ajoute un projet externe à build.gradle

140

J'ai un exemple de projet, avec la configuration suivante:

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

Où le « projet de test » dépend de la « bibliothèque de test », et le dernier dépend de la « librairie pure Java ». Compiler le projet et lancer cette configuration fonctionne très bien.

Je pense maintenant à importer mon précédent espace de travail Eclipse et à travailler avec Android Studio, le problème est que la configuration du projet est différente, et je voudrais que cela reste ainsi.

par exemple si vous souhaitez utiliser l'exemple précédent:

/root
  + Android Test Lib
  + Android Test Project

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

J'ai essayé de nombreuses configurations, mais je n'ai pas trouvé de moyen de référencer un projet en dehors de la portée du dossier parent (« racine » dans le cas de l'exemple).

Dans de nombreuses plates-formes / modules, vous pouvez utiliser le '..' pour remonter dans les dossiers, mais cela n'a pas fonctionné pour moi, peut-être que je l'ai mal utilisé.

Est-ce que quelqu'un sait comment cela peut être réalisé avec Gradle?

METTRE À JOUR

J'essaierai d'être plus générique:

/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

Je voudrais utiliser le module 1 du projet B , dans le projet A .


MISE À JOUR: 09-03-19

Je l'ai vu maintenant et je dois mettre à jour ... après presque 6 ans, aujourd'hui je suis plus sage, et je peux certainement dire que le problème était que je ne comprenais pas bien le concept de "Source de vérité".

Bien qu'avoir une référence dans une bibliothèque soit un concept agréable à avoir ... et peut sembler être une "Source de vérité", la VRAIE "Source de vérité" serait la version du code que chaque projet utilise de cette bibliothèque, car la bibliothèque en elle-même a des versions .. de nombreuses versions et la "Source de vérité" est relative au projet qui utilise la bibliothèque.

La bonne façon serait d'utiliser ce que la plupart des développeurs n'aiment pas, c'est-à-dire les sous-modules git, et oui, dupliquer les sources dans chaque projet car il y a plus de chances que chaque projet utilise une version différente du code.

Vous devrez cependant viser à ce que tous vos projets utilisent la dernière et la meilleure version de toutes vos bibliothèques .. ce qui est un défi en soi

La raison pour laquelle c'est la bonne façon de développer un projet avec des sources de bibliothèque est que cela évolue ... vous pouvez avoir des centaines de projets chacun avec sa propre configuration de bibliothèque.

TacB0sS
la source
4
Je vois que cette question retient l'attention ... Après avoir essayé vraiment très fort, j'ai abandonné le studio Android pour le moment, car la complexité de la configuration que j'essayais de construire était tout simplement trop importante et la construction de mon projet final était faisable, mais très instable. à chaque lancement du studio Android, j'ai dû définir à nouveau certains paramètres et faire fonctionner manuellement la construction. cela fait environ deux mois que j'ai abandonné, et j'espère que les choses vont mieux maintenant!
TacB0sS
L'approche 2 explique ici comment faire cela très facilement: stackoverflow.com/questions/25610727/…
Doron Ben-Ari

Réponses:

222

En supposant que Some Other Folder est un projet gradle, vous pouvez ajouter quelque chose comme ce qui suit à votre fichier settings.gradle:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
Ethan
la source
1
SomeOtherFolder pointe vers un dossier de projet et contient des modules que je suis intéressé à ajouter en tant que modules au projet Android Lib
TacB0sS
Le répertoire des paramètres pointe vers «root». J'ai besoin d'un niveau supérieur, vers un autre module dans un autre projet.
TacB0sS
pourriez-vous ajouter les sous-modules après cela? include ': someOtherFolder: proj1'
Ethan
1
mis à jour avec quelques détails. settings.gradle devrait être dans / Project A
Ethan
5
Très bonne réponse. Dans AS 1.0.2, j'avais également besoin de faire ce qui suit: Faites un clic droit sur le module -> Ouvrir les paramètres du module -> Dépendances -> + (en bas), sélectionnez Dépendance du module, sélectionnez votre bibliothèque dans la liste, cliquez sur ok :)
T. Coutlakis
49

Vous devez mettre dans votre fichier settings.gradle ces lignes:

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

Ensuite, vous devez ajouter dans votre builde.gradle (Module: app) dans l' arborescence des dépendances , cette ligne:

implementation project(':module2')

ou allez dans la structure du projet > application > dépendances , cliquez sur Ajouter , choisissez 3 dépendances de module et sélectionnez votre module

Dario Brux
la source
1
Si vous rencontrez des problèmes pour référencer les classes de la bibliothèque à partir de l'application principale, c'est parce que la bibliothèque est probablement disponible en différentes variantes. Donc, il suffit de spécifier la dépendance d'une manière appropriée: compile project(path: ':library', configuration: 'variant'). Ici, se variantcompose flavoret buildTypetel que défini par le build.gradlefichier de la bibliothèque . Par exemple, si vous voulez le releasetype de construction de la bibliothèque dans une developsaveur, alors variantest developRelease.
Sevastyan Savanyuk
9

Avec Gradle 1.10 (je ne sais pas pour quelles autres versions cela sera valable) c'est ce que j'ai trouvé en me basant sur une réponse donnée ici http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

J'ai un projet de bibliothèque API, un projet de bibliothèque commun et le projet d'application principal. Chacun est un projet de développement autonome et les deux bibliothèques sont destinées à être partagées entre plusieurs applications.

Dans settings.gradle pour le projet commun:

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

Ensuite, dans les paramètres du projet d'application principale.

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'

Dans chacun des fichiers build.gradle respectifs, vous les référencez simplement par le nom que vous leur avez donné dans settings.createProjectDescriptor comme vous le feriez pour toute autre dépendance de projet:

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

Cela semble fonctionner. Cela n'a même pas généré d'erreur pour plusieurs fichiers DEX définissant la bibliothèque api, je suppose que tout cela faisait partie du même processus de construction et Gradle était assez intelligent pour tout comprendre.

alphonzo79
la source
2
Je continue d'essayer ceci mais le problème est que les dépendances dans la bibliothèque respective semblent ne jamais être chargées. Donc, si je viens d'ouvrir la bibliothèque, cela semble bien, mais lorsque je l'essaye depuis l'application principale, cela indique que toutes les bibliothèques importées sont manquantes.
Czechnology
@Czechnology a eu le même problème. Résolu. Voir mon commentaire pour cette réponse: stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk
9

Faites un clic droit sur le projet - Sélectionnez "Ouvrir les paramètres du module" - Sélectionnez "Modules" dans le volet de gauche - Cliquez sur le symbole "+" en haut - Choisissez "Importer le module".

Après l'importation de Module. Vous devez l'ajouter en tant que dépendance pour votre projet actuel.

Gardez "Modules" sélectionné dans le volet de gauche et cliquez sur votre projet - Allez maintenant dans l'onglet dépendances et cliquez sur le symbole "+" qui se trouve en bas - Choisissez la troisième option "Dépendances du module" et si vous avez importé correctement votre projet, il le sera vous montrer tous les modules disponibles qui peuvent être ajoutés en tant que dépendance à votre projet actuel.

Varundroid
la source
Cela fonctionne presque ... le projet ne peut pas être construit car la sortie du module de dépendance n'est pas ajoutée au fichier build.gradle, ce qui est exactement mon problème d'origine.
TacB0sS
Je pense qu'avec gradle, vous devez mettre tous les projets dans le même dossier racine. Essayez ça. Placez le projet que vous souhaitez ajouter en tant que dépendance dans le même dossier que votre projet actuel.
Varundroid
C'est ce que personne ne veut faire mais ATM si vous voulez travailler avec Android Studio, c'est la façon de faire fonctionner les choses. Une autre façon alternative que je suis est de créer un projet dans Intellij configure toutes les dépendances, puis d'importer ce projet dans le studio Android.En faisant cela, je force Android Studio à utiliser le système de construction fourmi plutôt que Gradle. J'espère que ça aide. À votre santé!!
Varundroid
1
@Varundroid, la solution consiste d'abord à importer une référence à la bibliothèque autonome en utilisant la réponse d'Ethan. Ajoutez ensuite le module aux dépendances de l'application principale en utilisant votre réponse. Cela vous permet de référencer la même bibliothèque dans plusieurs applications sans avoir à dupliquer le code de la bibliothèque.
bcorso
1

Je pose à nouveau cette question d'une manière qui implique les intentions des affiches originales à Comment référencer les bibliothèques Android et Java personnalisées vivant en dehors du répertoire de notre projet principal Android?

Là, je réponds à ma propre question. Au fond, ma réponse utilise les informations de codage de gradle de @ Ethan (l'auteur de la réponse choisie dans le fil de discussion actuel). Mais ma réponse parcourt également d'autres pièges et fournit un exemple détaillé étape par étape.

John Bentley
la source
-1

Comme Ethan l'a dit, si vous ajoutez ceci à votre settings.gradle, il ajoutera un projet externe à Android Studio (dans cet exemple, il se trouve dans le dossier parent):

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

Ensuite, pour l'ajouter en tant que dépendance de l'un de vos projets, ajoutez-le simplement dans le build.gradle de ce projet comme une autre dépendance comme celle-ci (vous pouvez également le faire graphiquement comme ici ):

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