2012-03-16 28 views
28

Al especificar las dependencias del proyecto Gradle, ¿puedo evitar el uso de un nombre de proyecto absoluto completo y usar uno relativo? (Es decir, en mi ejemplo no quiero especificar explícitamente: app-a al hacer referencia a: dominio-a)Dependencias relativas a proyectos en Gradle?

//Directory structure 
app-a/ 
    domain-a/ 
    build.gradle 
    webapp-a/ 
    build.gradle 

aplicación web-A build.gradle:

apply plugin: 'java' 

//Build.gradle for webapp-a 
dependencies { 

    // Works 
    compile project(':app-a:domain-a') 

    //Doesn't work 
    compile project(projectDir.path + '/../domain-a/') 

    //Doesn't work 
    compile findProject('../domain-a') 

    //Doesn't work 
    compile project(':domain-a') 
} 
+0

proyecto de compilación (':' + parent.name + ': domain-a') funciona pero parece hacky – vicsz

+0

Aquí hay un ejemplo de trabajo que funciona con gradle2.2.1 pero no con android studio 1.0.2: http: // stackoverflow.com/questions/18936433/relative-gradle-project-dependency-with-holoeverywhere/27857759#27857759 – k3b

Respuesta

2

nombres relativos son una mala idea, ya que hacen que su proyecto dependa del proyecto más amplio en el que se encuentra. Ese no debería ser el caso. Sugiero evitar el uso del nombre relativo.

En términos de recuperar el proyecto principal como una dependencia, esto se haría siendo el directorio principal el predeterminado o el que fallara usaría el mecanismo de resolución de dependencia habitual, que utiliza las coordenadas (groupId, artifactId y versión) y se ve el artefacto en el repositorio local ..

+1

Sí ... Por lo general, busco caminos/nombres relativos ... pero esto parece una mala idea en este caso (y a juzgar por otros scripts de compilación gradle que he encontrado). – vicsz

+1

Independientemente de si son una buena idea, no entiendo por qué las rutas relativas serían más dependientes del proyecto que las rutas absolutas. ¿Qué sugieres en su lugar? – Stiggler

+0

Es mejor que los proyectos sean independientes e intercambien las salidas de dependencias/compilación como cualquier otra dependencia a través de un administrador de repositorio o, como mínimo, de su repositorio local. –

37

para el desarrollo de Android bajo Android Studio y Gradle, aquí está la forma de compilar una biblioteca que no está bajo la raíz de su proyecto, pero tiene una ruta relativa:

  1. Incluir la biblioteca en settings.gradle y anula el proyectoDir:

    include 'MyTestLibProject:MyTestLib' 
    project(':MyTestLibProject:MyTestLib').projectDir = new File(settingsDir, '../MyTestLibProject/MyTestLib') 
    
  2. Editar la build.gradle para la biblioteca para usar el plugin android-biblioteca en lugar de Android, esto hace que las salidas de la biblioteca para ser incluidos en proyectos que hacen referencia a él:

    apply plugin: 'android-library' 
    
  3. Especificar que su proyecto tiene una dependencia en el lib editando el build.gradle para el proyecto no lib:

    compile project(path: ':MyTestLibProject:MyTestLib') 
    
  4. Si el lib incluye cualquier frasco que su proj ect también incluye, la construcción los verá como una colisión cuando está generando el apk. tarros abstractos en un lib adicional que tanto el proyecto como referencia lib, o simplemente excluyen el frasco colisionar del proyecto principal y se deja coger el frasco de la dependencia:

    dependencies { 
        compile fileTree(dir: 'libs', include: '*.jar', exclude: '**/android-support-v4.jar') 
        compile project(path: ':MyTestLibProject:MyTestLib') 
    } 
    

AVISO: Esto no es tcómo gradle quiere que hagas esto: tienes la intención de publicar la lib usando maven y luego hacer referencia a la dependencia usando el "POM" de la lib publicada (que incluye el número de versión). Esto proporciona una mejor administración de la dependencia; por ejemplo, maven simplifica el escenario de tener muchos proyectos (con ciclos de lanzamiento variables) usando todas las versiones de una lib común. La técnica de ruta relativa que se describe aquí es una forma rápida de iniciar y ejecutar proyectos pequeños o como un paso intermedio para proyectos que se transfieren de hormiga.

Referencia: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Creating-a-Library-Project

+0

¡Gracias por esto, esto funciona! Hasta que todas las bibliotecas tengan su maven repo escupiendo archivos .aar, esta es la mejor solución – AfzalivE

+0

Lamentablemente, esto no funciona para mí. Obteniendo esos genéricos "Configuración con el nombre 'predeterminado' no encontrado." errores Suspiro. – rrbrambley

+0

@J c ¿Qué es 'settingsDir'? ¿Cómo puedo especificar la ruta absoluta del proyecto de la biblioteca? –

8

Aunque el uso de rutas relativas podría ser una mala práctica, a veces puede que sólo de esa manera necesitan. Sin embargo, aquí es cómo puede hacerlo funcionar.

Es necesario crear settings.gradle archivo dentro de la configuración de un webapp-

webapp-a /.Gradle

include '..:domain-a' 

Luego, en aplicación de web-a/build.gradle

compile project(':..:domain-a') 

(no lo he probado a mí mismo, sino que debería funcionar)

EDIT: reemplazado por ../domain-a..:domain-a en ambos archivos

+1

Esto dejó de funcionar con Gradle 1.11, no sé por qué. Tenía que seguir la otra respuesta. – Dalmas

0

Una respuesta tardía nunca hace daño. Mi solución estaba cerca de lo que sugirió @lihsus.

Digamos que tiene la siguiente estructura del proyecto:

//Directory structure 
app-a/ 
    domain-a/ 
     build.gradle 
    webapp-a/ 
     build.gradle 

Asegúrese de que su aplicación -a tiene una build.gradle y una settings.gradle.

En el settings.gradle de aplicación-a a continuación, puede incluir tanto los módulos/proyectos tales como:

include ':domain-a' 
include ':webapp-a' 

Y luego en webapp-a puede agregar dominio de una como una dependencia de compilación, como usted sugiere:

compile project(':domain-a') 
0

uso compilar proyecto ':'. No se requiere nada más. Ahora su proyecto 'usar' usará este proyecto compartido en su sistema de archivos/Eclipse/IntelliJ.

Cuestiones relacionadas