Plusieurs paramètres gradle fichiers pour de multiples projets de construction
J'ai de la structure de projet suivante
-->Starnderd Location
-->Project1
-->settings.gradle
-->build.gradle
-->Subproject11
-->build.gradle
-->Subproject12
-->build.gradle
-->Project2
-->settings.gradle
-->build.gradle
-->Subproject21
-->build.gradle
-->Subproject22
-->build.gradle
-->build.gradle
-->settings.gradle
Idée de projet ci-dessus de la structure, c'est que nous avons plusieurs projets qui contient des sous-projets, chaque projet peut avoir des dépendances à d'autres projets. Aussi à l'intérieur des sous-projets le projet peut avoir des dépendances à d'autres sous-projets dans le même projet. Les projets seront spécifiés dans les paramètres.gradle dans la racine. Également des paramètres.gradle à l'intérieur de chaque projet permettra de dire quels sont les sous-projets de ce projet en particulier.
Mes paramètres.gradle dans la racine serait ressemble
include 'Project1',
'Project2'
et Projet1 paramètres.gradle regarde comme
include 'SubProject11'
'SubProject12'
autres depndecy les commandes sont définies dans la version respectives.gradle fichiers
Si je rand gradle nettoyer construire installer à l'intérieur de l'emplacement racine(Standar place), il ne semble pas à l'utilisation de configurations dans le Projet, les paramètres de niveau.gradle fichier.
Ce que je fais ici est faux?
- Avez-vous trouvé une solution pour cela?
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de résoudre ce problème en un temps relativement propre. Des améliorations sont certainement les bienvenus!
Bien que Gradle ne prend pas en charge plusieurs
settings.gradle
les scripts en dehors de la boîte, il est possible de créer des sous-projets, chacun avec leur propresettings.gradle
fichier. Disons que vous avez multi-projet qui dépend de la multi-projet B, chacune avec leurs propres sous-projets. Votre structure de répertoire pourrait ressembler à:Hors de la boîte, Gradle attend
A/settings.gradle
à ressembler à quelque chose comme ceci:Le problème, c'est que chaque fois que B ajoute un nouveau projet,
A/settings.gradle
doit aussi changer, même si le nouveau projet est uniquement utilisée par B. Pour éviter cette situation, vous pourriez essayer deapply
B/settings.gradle
dansA/settings.gradle
au lieu d'ajouter des déclarations redondantes:Si vous essayez cela, vous verrez que Gradle échoue, car il génère le mal
projectDir
pour:bar
et:bap
. Il suppose à tort que B contient sont relatifs àsettingsDir
qui se trouve êtreA/
quand Gradle est invoquée à partir de cette racine du projet. Pour corriger cela, vous pouvez ajouter un autre script commeB/settings-parent.gradle
(le nom exact n'est pas significatif):Cette bandes
settingsDir.path
et préfixes le chemin avecB/
. Cela peut être étendu à plusieurs couches desettings[-parent].gradle
fichiers en ayant chaque couche d'ajouter lui-même sur le chemin. Maintenant, vous allez appliquer ce script àA/settings.gradle
:Avec ce régime, des nouveaux projets B ne sont pas inutilement pause
A/settings.gradle
et tous les projets peuvent être utilisées sans explicitement référence au B du sous-projet. Par exemple, si':foo'
voulu utiliser'B:bap'
, il peut simplement déclarer:Actuellement, Gradle ne supporte qu'un seul
settings.gradle
fichiers par construire. Cela pourrait changer dans l'avenir.Si vous utilisez Gradle 3.x, essayez includeBuild():
https://docs.gradle.org/current/userguide/composite_builds.html
Si vous utilisez Gradle 2.x, j'ai écrit une démonstration de cette fonction. Espérons, vous aidera à:
https://github.com/xujiaao/gradle-composite-build-demo
J'ai aussi regardé dans le présent et vous pouvez le faire, mais c'est très laid! La raison de ce qui se passe pour nous, c'est que la grande majorité du temps, nous voulons juste à construire à partir du plus haut niveau.
Si elle vous aide à tous, ce que vous devez faire est d'avoir le haut de la plupart des paramètres.gradle correctement un fichier de référence de chaque projet sous-projet directement. Reçois ce travail en premier.
Alors si Projet1 et Projet2 (et ainsi de suite) sont capables d'être construit indépendamment l'un de l'autre, vous pouvez faire un local settings.gradle fichier pour ce projet. Depuis, comme je l'ai dit ci-dessus, ce n'est pas ce que nous faisons habituellement, nous appelons ce fichier de paramètres.projet1. Si nous voulons utiliser ce fichier, on le copie sur paramètres.gradle. Je sais laid.
Mais il y a pire 🙂 une Fois que vous mettez ces paramètres.gradle fichier en place, vous générez à partir de Projet1 n'y aura plus haut niveau de construction.gradle fichier où vous avez probablement besoin des choses définies. Pour appeler, vous aurez besoin de quelque chose comme cela ajouté à chaque niveau du projet de construction.gradle fichier:
Ensuite, vous pouvez exécuter les projets de construction: gradle -Plocal construire
Moche, mais si vous en avez besoin, elle permet au moins de travail. Et dans l'intérêt de full-disclosure, ayant mis en place il y a quelques semaines, aucun des développeurs ont besoin et/ou utilisé. Sera probablement retirer dans un autre couple de semaines, si elle continue à ne pas être utilisé.
Rappelez-vous, que si vous construisez à partir de sous-projet lui-même, seule la sous-projet (et tout dépendant de projets) sera construit (bien que tous les gradle scripts seront compilées/évalué).
comme ce sujet a traversé mon travail quotidien assez souvent maintenant et à l'amélioration ( GRADLE-803 ), il est toujours ouvert, je voudrais partager mon approche ainsi:
À première vue, il ressemble à James Wald est réponse mais a une différence. Vous n'avez pas besoin de diviser vos fichiers de paramètres en quelque sorte dans le sous-projet. Il y a un moyen propre à tout faire dans le super projet si cela est acceptable pour vous. Normalement, vos petits sous-projets ne devraient pas avoir à se préoccuper de la entourant super projets. Ils comprennent leurs sous dépendances et c'est tout. Il doit également être sans importance la façon dont le module répertoire est nommé, en Wald approche le module lui-même a besoin de connaître son nom de répertoire ("B") ici:
En revanche, généralement, un super projet connaît ses sous-projets et des répertoires bien, parce qu'ils pourraient être submodules par exemple, qui ont bien défini résoudre les noms qui peuvent être, à partir de la super point de vue du projet, en toute sécurité référencés.
C'est mon installation (à l'aide de Gradle 2.4):
Dans le super paramètres du projet.gradle vous pouvez maintenant écrire le code suivant:
Il a toujours l'air assez bavard (et encore n'ajoute pas de véritable hiérarchie comportement), mais conserve l'effort supplémentaire dans le super projet où vous avez normalement besoin de tout savoir à propos de votre contenait des modules, de toute façon.
Le reste est assez simple de nouveau.
Si vous voulez voir mon approche dans la pratique, lisez la section 5.) de ce post de blog, où j'ai explicitement que cette indépendance entre les modules ou consultez mon projet github sur cross-language benchmarks. Mais sachez, vous ont besoin d'un compilateur natif de la chaîne comme gcc ou Clang pour l'exécuter 😉
Espérons que cette aide!
Cheers
Ben
En s'appuyant sur les réponses précédentes c'est ce que je suis venu avec.
L'avantage, c'est pas de chevauchement.