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.

¿Cómo puede el plugin de Gradle acceder a información sobre las construcciones incluidas?

Sé que puedes acceder a diferentes módulos (incluidos usando include) en un proyecto a través de org.gradle.api.Project#getSubprojects(), y sé que puedes obtener el nombre y los directorios de las compilaciones separadas que se han incluido (usando includeBuild) a través de org.gradle.api.invocation.Gradle#getIncludedBuilds().

Pero, ¿cómo puede mi complemento obtener información como las ubicaciones de los archivos fuente y los archivos de clase de los proyectos incluidos utilizando includeBuild?

Mi objetivo aquí es determinar qué archivos han cambiado en la rama actual de git (lo cual puedo hacer), y luego recopilar sus archivos de clase correspondientes en un archivo jar que se utiliza para nuestro mecanismo de parcheo que inserta los archivos jar de parche al principio del classpath en lugar de volver a implementar toda la aplicación.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener información como las ubicaciones de los archivos fuente de Java y los archivos de clase para los proyectos incluidos mediante el uso de includeBuild, puedes utilizar la instancia Project para el build incluido y luego llamar al método getSourceSets() para obtener los conjuntos de fuentes de Java para cada proyecto. Esto te dará acceso a las ubicaciones de los archivos fuente de Java. De manera similar, puedes utilizar el método getOutputs() en cada proyecto para obtener las ubicaciones de los archivos de clase.

    Aquí tienes un ejemplo de cómo puedes lograr esto en tu plugin:

    import org.gradle.api.Plugin
    import org.gradle.api.Project
    
    class MyPlugin implements Plugin<project> {
        void apply(Project project) {
            project.gradle.includedBuilds.each { includedBuild ->
                includedBuild.allprojects.each { subProject ->
                    subProject.sourceSets.each { sourceSet ->
                        println "Archivos fuente para ${subProject.projectDir.name}:${sourceSet.name} ubicados en ${sourceSet.java.srcDirs}"
                        println "Archivos de clase para ${subProject.projectDir.name}:${sourceSet.name} ubicados en ${sourceSet.output.classesDir}"
                    }
                }
            }
        }
    }
    

    En este ejemplo, iteramos sobre cada uno de los builds incluidos y luego sobre todos los proyectos en esos builds. Para cada proyecto, obtenemos los conjuntos de fuentes y las salidas e imprimimos sus ubicaciones en la consola.

    Luego, puedes utilizar esta información para recopilar los archivos de clase correspondientes en un archivo jar según tus requisitos para tu mecanismo de parches.

Comments are closed.