es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Inferir dependencias en un subproyecto de Gradle a partir de su proyecto padre.

Actualmente tengo 3 subproyectos en mi proyecto Gradle, estructurados de la siguiente manera:

Proyecto principal
|
— Proyecto A
— Proyecto B
— Src Común

El Proyecto A depende de Librería A y Src Común, y el Proyecto B depende de Librería B y Src Común. Librería A y Librería B contienen diferentes implementaciones de las mismas clases.

Mi plan para el proyecto Src Común era albergar todas las clases de utilidad, dependiendo necesariamente tanto de Librería A como de Librería B.

¿Existe alguna forma de configurar esto y cómo debería verse mi proyecto Gradle?

Cosas que he intentado:

  1. He intentado eliminar Src Común como subproyecto y solo incluirlo en las fuentes de Proyecto A y Proyecto B. Sin embargo, IntelliJ parece marcar Src Común como origen de las fuentes de Proyecto A, y aunque la compilación a través de Gradle funciona, no logro que IntelliJ reconozca que Proyecto B también tiene como origen de las fuentes a Src Común.

  2. Agregar tanto Librería A como Librería B como dependencia de Src Común, pero obviamente eso no funciona.

El contexto:

He creado un mod de Minecraft compatible tanto con Forge (Proyecto A) como con Fabric (Proyecto B). Tengo clases de utilidad en ambos proyectos que tienen el mismo código fuente pero necesitan ser compiladas dos veces, cada vez con una dependencia diferente. No quiero tener que escribir el código dos veces cada vez que quiera cambiar algo en las clases de utilidad.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    Para configurar esto, debes mantener Common Src como un subproyecto separado e incluirlo como una dependencia en Project A y Project B. Para manejar las dependencias conflictivas, puedes utilizar las configuraciones y estrategias de resolución de Gradle.

    1. Crea un bloque de configuración en tu script de Gradle para Common Src, de la siguiente manera:
    configurations {
       commonCode
    }
    
    1. Agrega las dependencias de Lib A y Lib B a la configuración commonCode, pero utiliza la estrategia de resolución de Gradle para elegir la correcta para cada subproyecto:
    dependencies {
      commonCode("group:lib-a:version") {
        targetCompatibility = "${project.targetCompatibility}"
        resolutionStrategy {
          force "group:lib-a:version"
        }
      }
      commonCode("group:lib-b:version") {
        targetCompatibility = "${project.targetCompatibility}"
        resolutionStrategy {
          force "group:lib-b:version"
        }
      }
    }
    
    1. En el archivo build.gradle de Project A y Project B, agrega una dependencia en la configuración commonCode:
    dependencies {
      compile project(":commonSrc")
      compile configurations.commonCode
      ...
    }
    

    ¡Eso es todo! Con esta configuración, Common Src contendrá el código de utilidad compartido y ambos subproyectos podrán utilizarlo, cada uno con la versión correcta de las dependencias conflictivas.

Comments are closed.