Come posso importare uno script Gradle in un altro?


97

Ho uno script gradle complesso che racchiude un carico di funzionalità attorno alla creazione e alla distribuzione di una serie di progetti netbeans in un numero di ambienti.

Lo script funziona molto bene, ma in sostanza è tutto configurato attraverso una mezza dozzina di mappe che contengono informazioni sul progetto e sull'ambiente.

Desidero astrarre le attività in un altro file, in modo da poter semplicemente definire le mie mappe in un semplice file di build e importare le attività dall'altro file. In questo modo, posso utilizzare le stesse attività principali per una serie di progetti e configurarli con un semplice set di mappe.

Qualcuno può dirmi come posso importare un file gradle in un altro, in modo simile al compito di Ant? Finora ho cercato inutilmente i documenti di Gradle.

Informazioni addizionali

Dopo la risposta di Tom di seguito, ho pensato di provare a chiarire esattamente cosa intendo.

Fondamentalmente ho uno script gradle che esegue una serie di sottoprogetti. Tuttavia, i sottoprogetti sono tutti progetti Netbeans e vengono forniti con i propri script di compilazione delle formiche, quindi ho compiti in gradle per chiamare ciascuno di questi.

Il mio problema è che ho alcune configurazioni all'inizio del file, come ad esempio:

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

Genero quindi attività come:

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

Ho molti di questi tipi di frammenti di generazione di attività e tutti sono generici: dipendono interamente dalla configurazione nell'elenco dei progetti.

Quindi quello che voglio è un modo per metterlo in uno script separato e importarlo nel seguente modo:

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.

Quindi, in questo esempio, tasks.gradle includerà tutto il codice generico per la generazione di attività e verrà eseguito per i progetti definiti nel file build.gradle principale. In questo modo, tasks.gradle è un file che può essere utilizzato da tutti i progetti di grandi dimensioni che consistono in un numero di sottoprogetti con i file di compilazione di Netbeans.


3
Considera il costrutto "applica da: 'altro.gradle'" per importare dichiarazioni esterne. (Vedi "12.4. Configurazione del progetto utilizzando uno script di build esterno" qui gradle.org/0.9-preview-1/docs/userguide/… )
Petr Gladkikh

@PetrGladkikh apply fromesegue immediatamente le attività esterne. Questo potrebbe non essere preferibile nella logica di esecuzione (cioè vorrei eseguire le attività quando voglio, non subito).
IgorGanapolsky

Questa affermazione nel commento sopra non è vera : apply fromesegue immediatamente le attività esterne. Non farti fuorviare. Le attività esterne vengono configurate, non eseguite.
Jarekczek

Risposte:



17

La risposta alla domanda si è rivelata nel sistema Plugins, dove è possibile aggiungere la funzionalità desiderata in una serie di plugin che possono essere file groovy situati nella directory buildSrc/src/main/groovy. I plugin possono anche essere raggruppati come Jar anche se non l'ho provato.

Dettagli qui: Plugin personalizzati


Solo così sai che il collegamento è interrotto: ecco un aggiornamento gradle.org/docs/current/userguide/…
JARC


4

Bene, è difficile dire cosa ti serve meglio senza effettivamente vedere il tuo file di build.

Potrei presumere che impostare il tuo ambiente come build multi-progetto dovrebbe fornirti l'astrazione che stai cercando.

Nella root del tuo progetto build.gradledefinisci tutte le cose specifiche del tuo dominio così come le cose che si applicano a tutti i tuoi sottoprogetti:

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()

La directory principale del progetto potrebbe anche contenere un gradle.propertiesfile in cui definire le proprietà utilizzate dai progetti:

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

Quindi in un file aggiuntivo dalla radice del progetto denominato in settings.gradlerealtà punti ai tuoi sottoprogetti:

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')
...

Ogni directory del sottoprogetto contiene un build.gradlefile contenente solo le cose specifiche del sottoprogetto.

Non importa se si richiama gradledalla radice del progetto o dalla directory del sottoprogetto, gradle considererà automaticamente tutte le definizioni eseguite nei vari file.

Si noti inoltre che nessuna attività di compilazione verrà eseguita per la radice del progetto fintanto che non si carica alcun plug-in oltre al plug-in predefinito a livello di radice.


1
Grazie per aver dedicato del tempo per rispondere. Non sono i sottoprogetti con cui ho problemi, ma piuttosto la creazione di una "libreria" di attività comuni. Ho modificato la mia domanda originale con più informazioni e frammenti di codice per rendere le cose più chiare.
Anthony Roy,

1
Quindi, invece di eseguire l'importazione ("tasks.gradle") dal tuo esempio, avresti la sezione sottoprogetti {} che specifica il codice generico di generazione dell'attività utilizzato da tutti i tuoi sottoprogetti. Questo dovrebbe fornire la stessa astrazione che stai cercando !?
Tom

Il plugin Ivy è davvero necessario qui? Non si può usare Gradle da solo?
IgorGanapolsky
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.