web-dev-qa-db-fra.com

Pourquoi Gradle a-t-il besoin d'un fichier settings.gradle?

Je vais convertir mes projets Android de Ant à Gradle.

Mon espace de travail Eclipse est très simple:

Workspace
     MyApp
     MyApp-AndroidLibrary

Lorsque j'ajoute un fichier build.gradle dans MyApp, je veux faire référence à mon Android:

apply plugin: 'Android'

dependencies {
     compile fileTree(dir: 'libs', include: '*.jar')
     compile project(':MyApp-AndroidLibrary')
}

Lorsque j'exécute la génération de Gradle, il y a une erreur "Projet avec chemin ': MyApp-AndroidLibrary' est introuvable dans le projet racine", j'ai recherché cela sur Google et j'ai besoin de configurer un fichier "settings.gradle" dans mon espace de travail répertoire, pour ajouter

include ":MyApp"
include ":MyApp-AndroidLibrary"

Cela me semble trop mauvais, pourquoi Gradle a besoin d'un fichier settings.gradle, pourquoi ne pas simplement extraire les projets que j'ai définis dans les dépendances?

Et qu'est-ce que include signifie vraiment? Et si j'ai une autre application et quelques autres bibliothèques partagées dans l'espace de travail, la structure peut ressembler à ceci:

Workspace
     App1
     App2
     Library1(Used by App1 & App2)
     Library2(Used only by App1)
     Library3(Used only by App2)

Puisqu'il n'y a qu'UN fichier settings.gradle, j'ai dû les ajouter tous dans settings.gradle. Ça ne sent pas bon.

Et oui, je peux réorganiser la structure pour faire de Library2 un répertoire enfant d'App1 et Library3 pour être un répertoire enfant d'App2, mais qu'en est-il de Library1?

Un commentaire à ce sujet?

39
virsir

Vous posez plusieurs questions différentes. Voici quelques conseils:

  • ':MyApp-AndroidLibrary' est un chemin de projet logique , qui est mappé sur un chemin physique en fonction des informations fournies dans settings.gradle.
  • Une génération multi-projets peut avoir une structure de répertoires arbitraire, qui est configurée dans settings.gradle. Pas besoin de déplacer les répertoires, sauf si vous le souhaitez.
  • L'espace de travail Eclipse et la construction Gradle sont des limites distinctes. Vous pouvez avoir plusieurs versions dans le même espace de travail.
  • Lorsque vous travaillez avec des bibliothèques construites à partir des sources, vous pouvez soit les intégrer à la même génération, soit avoir une génération distincte pour elles. Dans ce dernier cas, vous devez vous assurer de créer la bibliothèque avant l'application et d'échanger des artefacts via un référentiel Maven ou Ivy. Cela pourrait être automatisé à l'aide d'un serveur CI et d'un référentiel Maven/Ivy d'entreprise. Alternativement, vous pouvez déclencher la création de la bibliothèque manuellement sur votre machine et utiliser un référentiel Maven/Ivy local.

Pour plus d'informations, consultez le Gradle User Guide , en particulier le chapitre sur les builds multi-projets.

14
Peter Niederwieser

Juste au cas où des gens (comme moi ou Gladman) auraient toujours ce problème et ne trouveraient pas de solution. Avec la version actuelle de Gradle, vous pouvez le faire:

Déplacer le fichier settings.gradle vers le répertoire My-App et remplacez le include par includeFlat 'MyApp-AndroidLibrary'. Cela devrait résoudre le problème.

Comparez également cette question et voyez cette section dans le guide de l'utilisateur Gradle pour plus de détails.

0
Joerg