Android studio agrega proyecto externo a build.gradle

139

Tengo un proyecto de muestra, con la siguiente configuración:

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

Donde el ' Proyecto de prueba ' depende de la ' Libra de prueba ', y el último depende de la ' Lib de Java pura ' Compilar el proyecto y ejecutar esta configuración funciona bien.

Ahora estoy pensando en importar mi espacio de trabajo anterior de Eclipse y trabajar con Android Studio, el problema es que la configuración del proyecto es diferente y me gustaría mantenerlo así.

por ejemplo si usar el ejemplo anterior:

/root
  + Android Test Lib
  + Android Test Project

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

Intenté muchas configuraciones, pero no encontré una manera de hacer referencia a un proyecto fuera del alcance de la carpeta principal (' raíz ' en el caso de ejemplo).

En muchas plataformas / módulos, puede usar '...' para subir en las carpetas, pero esto no funcionó para mí, tal vez lo he usado mal.

¿Alguien sabe cómo se puede lograr esto con Gradle?

ACTUALIZAR

Intentaré ser más genérico:

/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

Me gustaría utilizar el Módulo 1 del proyecto B , en el proyecto A .


ACTUALIZACIÓN: 09-03-19

Vi esto ahora y debo actualizar ... después de casi 6 años, hoy soy más sabio, y definitivamente puedo decir que el problema fue que entendí mal el concepto de "Fuente de la verdad".

Si bien tener una referencia a una biblioteca es un buen concepto ... y puede parecer una "Fuente de la verdad", la REAL "Fuente de la verdad" sería la versión del código que cada proyecto está usando de esa biblioteca, porque la biblioteca por sí misma tiene versiones ... muchas versiones y la "Fuente de la verdad" es relativa al proyecto que está usando la biblioteca.

La forma correcta sería usar lo que a la mayoría de los desarrolladores no les gusta, y eso es submódulos git, y sí duplicar las fuentes en cada proyecto porque la mayoría de las posibilidades de que cada proyecto use una versión diferente del código.

Sin embargo, deberá apuntar a que todos sus proyectos utilicen la última y mejor versión de todas sus bibliotecas ... lo cual es un desafío en sí mismo

La razón por la que esta es la forma correcta de desarrollar un proyecto con fuentes de biblioteca es que esto se escala ... puede tener cientos de proyectos cada uno con su propia configuración de biblioteca.

TacB0sS
fuente
44
Veo que esta pregunta recibe algo de atención ... Después de intentarlo realmente duro, me di por vencido en el estudio de Android por ahora, ya que la complejidad de la configuración que estaba tratando de construir era demasiado, y la construcción de mi proyecto final fue factible, pero muy inestable Con cada lanzamiento del estudio de Android tuve que establecer algunos parámetros nuevamente y hacer que la compilación funcione manualmente. Han pasado aproximadamente dos meses desde que me di por vencido, ¡y espero que las cosas estén mejor ahora!
TacB0sS
Enfoque 2 aquí explica cómo hacer esto muy fácilmente: stackoverflow.com/questions/25610727/…
Doron Ben-Ari

Respuestas:

222

Suponiendo que Some Other Folder es un proyecto gradle, puede agregar algo como lo siguiente a su archivo settings.gradle:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')
Ethan
fuente
1
SomeOtherFolder apunta a una carpeta de proyecto y en ella hay módulos, que estoy interesado en agregar como módulos al proyecto Android Lib
TacB0sS
El directorio de configuración apunta a 'root' Necesito obtener un nivel más alto, a otro módulo en otro proyecto.
TacB0sS
¿podría agregar los submódulos después de eso? incluyen ': someOtherFolder: proj1'
Ethan
1
actualizado con algunos detalles. settings.gradle debería estar en / Proyecto A
Ethan
55
Gran respuesta. En AS 1.0.2, también necesitaba hacer lo siguiente: Módulo de clic derecho -> Abrir configuración del módulo -> Dependencias -> + (abajo), seleccione Dependencia del módulo, seleccione su biblioteca de la lista, haga clic en Aceptar :)
T. Coutlakis
49

Tienes que poner en la configuración de tu archivo. Gradle estas líneas:

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

Luego debe agregar su builde.gradle (Módulo: aplicación) en el árbol de dependencias , esta línea:

implementation project(':module2')

o vaya a Estructura del proyecto > aplicación > Dependencias , haga clic en Agregar , elija 3 Dependencias del módulo y seleccione su módulo

Dario Brux
fuente
1
Si tiene problemas para hacer referencia a las clases de la biblioteca desde la aplicación principal, esto se debe a que la biblioteca probablemente viene en diferentes variantes. Por lo tanto, basta con especificar la dependencia de una manera adecuada: compile project(path: ':library', configuration: 'variant'). Aquí, variantconsiste en flavory buildTypesegún lo definido por el build.gradlearchivo de la biblioteca . Por ejemplo, si desea releasecompilar el tipo de biblioteca en un developsabor, entonces variantes developRelease.
Sevastyan Savanyuk
9

Con Gradle 1.10 (no sé para qué otras versiones será válido) esto es lo que se me ocurrió en base a una respuesta dada aquí http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

Tengo un proyecto de biblioteca api, un proyecto de biblioteca común y el proyecto principal de la aplicación. Cada uno es un proyecto de desarrollo independiente y las dos bibliotecas están destinadas a ser compartidas entre múltiples aplicaciones.

En settings.gradle para el proyecto común:

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

Luego, en la configuración principal del proyecto de la aplicación.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'

En cada uno de los archivos build.gradle respectivos, solo debe hacer referencia a ellos por el nombre que les dio en settings.createProjectDescriptor como lo haría con cualquier otra dependencia del proyecto:

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

Esto parece funcionar. Sospeché que ni siquiera arrojó un error para múltiples archivos DEX que definían la biblioteca api, porque todo era parte del mismo proceso de compilación y Gradle era lo suficientemente inteligente como para resolverlo todo.

alphonzo79
fuente
2
Sigo intentando esto, pero el problema es que las dependencias en la biblioteca respectiva parecen nunca cargarse. Entonces, si solo tengo la biblioteca abierta, parece estar bien, pero cuando lo pruebo desde la aplicación principal, dice que faltan todas las bibliotecas importadas.
Czechnology
@Czechnology tuvo el mismo problema. Resuelto. Vea mi comentario para esta respuesta: stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk
9

Haga clic derecho en el proyecto - Seleccione "Abrir configuración de módulo" - Seleccione "Módulos" en el panel izquierdo - Haga clic en el símbolo "+" en la parte superior - Elija "Importar módulo".

Después de importar el módulo. Debe agregarlo como una dependencia para su proyecto actual.

Mantenga "Módulos" seleccionados en el panel izquierdo y haga clic en su proyecto - Ahora vaya a la pestaña de dependencias y haga clic en el símbolo "+" que se encuentra en la parte inferior - Elija la tercera opción "Dependencias del módulo" y si ha importado su proyecto correctamente, lo hará le muestra todos los módulos disponibles que se pueden agregar como dependencia a su proyecto actual.

Varundroid
fuente
Esto casi funciona ... el proyecto no se puede compilar porque la salida del módulo de dependencia no se agrega al archivo build.gradle, que es exactamente mi problema original.
TacB0sS
Creo que con Gradle, debes poner todos los proyectos en la misma carpeta raíz. Trata eso. Coloque el proyecto que desea agregar como dependencia en la misma carpeta que su proyecto actual.
Varundroid
Esto es lo que nadie quiere hacer, pero ATM si quieres trabajar con Android Studio, esta es la forma de hacer que las cosas funcionen. Otra forma alternativa que estoy siguiendo es: creo un proyecto en Intellij, configuro todas las dependencias y luego importo ese proyecto a Android Studio, al hacer esto, estoy obligando a Android Studio a usar el sistema de compilación ant en lugar de Gradle. Espero eso ayude. ¡¡Salud!!
Varundroid
1
@Varundroid, la solución es importar primero una referencia a la biblioteca independiente utilizando la respuesta de Ethan. Luego agregue el módulo a las dependencias de la aplicación principal utilizando su respuesta. Esto le permite hacer referencia a la misma biblioteca en múltiples aplicaciones sin tener que duplicar el código de la biblioteca.
bcorso
1

Vuelvo a hacer esta pregunta de una manera que implica las intenciones de los carteles originales en ¿Cómo hacemos referencia a las bibliotecas personalizadas de Android y Java que viven fuera del directorio de nuestro proyecto principal de Android?

Ahí respondo mi propia pregunta. En el fondo, mi respuesta utiliza la información de codificación gradle de @ Ethan (el autor de la respuesta elegida en el hilo actual). Pero mi respuesta también navega por otras trampas y proporciona un ejemplo detallado paso a paso.

John Bentley
fuente
-1

Como dijo Ethan, si agrega esto a su settings.gradle, agregará un proyecto externo a Android Studio (en este ejemplo, está en la carpeta principal):

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

Luego, para agregarlo como una dependencia de uno de sus proyectos, simplemente agréguelo en el build.gradle de ese proyecto como otra dependencia como esta (también puede hacerlo gráficamente como aquí ):

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