¿Cómo puedo importar un script de Gradle a otro?


Tengo un complejo script de gradle que envuelve una carga de funcionalidad en torno a la construcción e implementación de una serie de proyectos netbeans a una serie de entornos.

El script funciona muy bien, pero en esencia todo está configurado a través de media docena de mapas que contienen información del proyecto y del entorno.

Quiero abstraer las tareas en otro archivo, de modo que simplemente pueda definir mis mapas en un archivo de compilación simple e importar las tareas desde el otro archivo. De esta manera, puedo utilice las mismas tareas básicas para varios proyectos y configure esos proyectos con un simple conjunto de mapas.

¿Puede alguien decirme cómo puedo importar un archivo de gradle a otro, de manera similar a la tarea de Ant? He rastreado los documentos de Gradle en vano hasta ahora.

Información Adicional

Después de la respuesta de Tom a continuación, pensé en tratar de aclarar exactamente lo que quiero decir.

Básicamente tengo un script de gradle que ejecuta una serie de subproyectos. Sin embargo, los subproyectos son todos proyectos Netbeans, y vienen con sus propios scripts de construcción ant, por lo que tengo tareas en gradle para llamar a cada uno de ellos.

Mi problema es que tengo cierta configuración en la parte superior del archivo, como:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

Luego genero tareas como:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

Tengo muchos de estos tipos de fragmentos de generación de tareas, y todos ellos son genéricos - dependen completamente de la configuración en la lista de proyectos.

Así que lo que quiero es una forma de poner esto en un script separado e importarlo de la siguiente manera:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

Así que en este ejemplo, tareas.gradle tendrá todo el código de generación de tareas genéricas y se ejecutará para los proyectos definidos en la compilación principal.archivo gradle. De esta manera, tareas.gradle es un archivo que puede ser utilizado por todos los proyectos grandes que consisten en un número de subproyectos con archivos de compilación Netbeans ant.

Author: Anthony Roy, 2010-02-15

3 answers

Hay una nueva característica en 0.9. Puede usar el comando apply from: 'other.gradle'.

Lee mi pregunta sobre lo mismo en: ¿Hay una manera de dividir / factorizar las partes comunes de Gradle build

 107
Author: Andrey Adamovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:12

La respuesta a la pregunta resultó estar en el sistema de Plugins, donde se puede agregar la funcionalidad deseada en un conjunto de plugins que pueden ser archivos groovy ubicados en el directorio buildSrc/src/main/groovy. Los complementos también se pueden incluir como un frasco, aunque no he probado esto.

Detalles aquí: Complementos personalizados

 13
Author: Anthony Roy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 19:25:45

Bueno, es difícil saber qué le sirve mejor sin ver realmente su archivo de compilación.

Podría asumir que establecer su entorno como construcción multi-proyecto debería proporcionarle la abstracción que está buscando.

En la raíz de tu proyecto build.gradle defines todas las cosas específicas de tu dominio, así como las cosas que se aplican a todos tus subproyectos:

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

El directorio raíz del proyecto también puede contener un archivo gradle.properties donde se definen las propiedades utilizadas por sus proyectos:

buildDirName=staging
repo.dest.dir=/var/repo
...

Luego, en un archivo adicional de la raíz de tu proyecto llamado settings.gradle en realidad apuntas a tus subproyectos:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

Cada directorio de subproyecto contiene un archivo build.gradle que contiene solo el material específico del subproyecto.

No importa si invoca gradle desde el directorio raíz o subproyecto de su proyecto, gradle considerará automáticamente todas las definiciones realizadas en los diversos archivos.

También tenga en cuenta que no se ejecutará ninguna tarea de compilación para su proyecto root siempre y cuando no cargue ningún complemento más allá del complemento predeterminado en el nivel raíz.

 4
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-19 00:19:01