144 votes

Android studio ajoute un projet externe à build.gradle

J'ai un projet type, avec la configuration suivante :

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

Où le ' Projet d'essai dépend de l'option ' Test Lib et le dernier dépend de l'option ' Pure Java Lib ' La compilation du projet et le lancement de cette installation fonctionnent parfaitement.

J'envisage maintenant d'importer mon ancien espace de travail Eclipse et de travailler avec Android studio, le problème est que la configuration du projet est différente, et je voudrais qu'elle reste ainsi.

par exemple si l'on reprend 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 l'étendue du dossier parent ( Racine dans le cas de l'exemple).

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

Quelqu'un sait-il comment cela peut être réalisé avec Gradle ?

UPDATE

Je vais essayer 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 de projet B , dans le projet A .


MISE À JOUR : 09-03-19

J'ai vu cela maintenant et je dois mettre à jour... après presque 6 ans, aujourd'hui je suis plus sage, et je peux définitivement dire que le problème était que je comprenais mal le concept de "Source de vérité".

Bien qu'avoir une référence unique à une bibliothèque soit un concept intéressant et puisse 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 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 méthode serait d'utiliser ce que la plupart des développeurs n'aiment pas, à savoir les submodules git, et oui, de dupliquer les sources dans chaque projet, car il est fort probable que chaque projet utilise une version différente du code.

Vous devrez cependant faire en sorte que tous vos projets utilisent la dernière et la meilleure version de toutes vos bibliothèques, ce qui constitue un défi en soi

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

4 votes

Je vois que cette question suscite une certaine attention... Après avoir essayé vraiment très dur, j'ai abandonné Android studio pour le moment, car la complexité de la configuration que j'essayais de construire était tout simplement trop grande, et la construction de mon projet final était faisable, mais très instable. à chaque lancement d'Android studio, je devais 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 !

0 votes

L'approche 2 ici explique comment le faire très facilement : stackoverflow.com/questions/25610727/

225voto

Ethan Points 2382

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

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')

1 votes

Le someOtherFolder pointe vers un dossier de projet dans lequel se trouvent des modules que je souhaite ajouter comme modules au projet Android Lib.

0 votes

Le répertoire des paramètres pointe vers "Root". J'ai besoin d'aller un niveau plus haut, vers un autre module dans un autre projet.

0 votes

Pourriez-vous ajouter les submodules après cela ? include ':someOtherFolder:proj1' ?

54voto

Dario Brux Points 1649

Vous devez mettre dans votre dossier paramètres.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 le Dépendances arbre, cette ligne :

implementation project(':module2')

ou aller dans la Structure du projet > application > Dépendances cliquez sur Ajouter choisissez 3 Dépendances des modules et sélectionnez votre module

9voto

alphonzo79 Points 171

Avec Gradle 1.10 (je ne sais pas pour quelles autres versions cela sera valable) voici 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 d'api, un projet de bibliothèque commune et un projet d'application principale. 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'

Puis dans le projet d'application principal 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'

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

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

Cela semble fonctionner. Il n'y a même pas eu d'erreur pour les fichiers DEX multiples définissant la bibliothèque api, je suppose que c'est parce que tout cela faisait partie du même processus de construction et que Gradle était assez intelligent pour tout comprendre.

2 votes

Je continue d'essayer mais le problème est que les dépendances dans la bibliothèque respective semblent ne jamais être chargées. Ainsi, si je n'ai que la bibliothèque ouverte, tout semble aller bien, mais lorsque je l'essaie à partir de l'application principale, il est indiqué que toutes les bibliothèques importées sont manquantes.

0 votes

@Czechnology J'ai eu le même problème. Je l'ai résolu. Voir mon commentaire pour cette réponse : stackoverflow.com/a/29603354/7408927

8voto

Varundroid Points 1374

Cliquez avec le bouton droit de la souris 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 avoir importé le module. Vous devez l'ajouter comme une dépendance pour votre projet actuel.

Gardez "Modules" sélectionné dans le volet de gauche et cliquez sur votre projet - Maintenant, allez dans l'onglet "Dépendances" et cliquez sur le symbole "+" qui est situé en bas - Choisissez la troisième option "Module Dependencies" et si vous avez importé votre projet correctement, il vous montrera tous les modules disponibles qui peuvent être ajoutés comme une dépendance à votre projet actuel.

0 votes

Cela a failli fonctionner... 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 initial.

0 votes

Je pense qu'avec gradle, vous devez mettre tous les projets dans le même dossier Root. Essayez cela. Mettez le projet que vous voulez ajouter comme dépendance dans le même dossier que votre projet actuel.

0 votes

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 alternative que je suis est de créer un projet dans Intellij, de configurer toutes les dépendances, puis d'importer ce projet dans Android Studio. En faisant cela, je force Android Studio à utiliser le système de construction Ant plutôt que Gradle. J'espère que cela vous aidera. A la vôtre !

1voto

John Bentley Points 149

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

Là, je réponds à ma propre question. Au fond, ma réponse utilise l'aperçu du codage gradle de @Ethan (l'auteur de la réponse choisie dans le fil actuel). Mais ma réponse aborde également d'autres problèmes et fournit un exemple détaillé étape par étape.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X