2010-02-15 11 views
76

Ho uno script gradle complesso che avvolge un carico di funzionalità attorno alla creazione e alla distribuzione di numerosi progetti netbeans in un numero di ambienti.Come posso importare uno script Gradle in un altro?

Lo script funziona molto bene, ma in sostanza è tutto configurato attraverso una mezza dozzina di mappe contenenti 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 file di build semplice e importare le attività dall'altro file. In questo modo, posso utilizzare le stesse attività di base per un numero di progetti e configurare quei progetti con un semplice insieme di mappe.

Qualcuno può dirmi come posso importare un file gradle in un altro, in modo simile al compito di Ant? Ho trascinato i documenti di Gradle inutilmente fino ad ora.

Altre Informazioni

Dopo la risposta di Tom di seguito, ho pensato di provare e chiarire esattamente quello che voglio dire.

Fondamentalmente ho uno script gradle che esegue un numero di sottoprogetti. Tuttavia, i sottoprogetti sono tutti progetti di Netbeans e sono dotati di propri script di formica, quindi ho compiti in grado di chiamare ciascuno di questi.

Il mio problema è che ho un po 'di configurazione della parte superiore del file, come ad esempio:

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

ho quindi generare compiti quali:

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

ho molte di queste specie 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 mettere questo in uno script separato e importarlo nel seguente sorta di passaggio:

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 avrà tutta la generazione degli esercizi generici inserisci 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 costituiti da un numero di sottoprogetti con i file di build ant di Netbeans.

+3

considerare "applicabile a decorrere: 'other.gradle'" costruire importare dichiarazioni esterne. (Vedi "12.4 Configurare il progetto usando uno script di compilazione esterno" qui http://gradle.org/0.9-preview-1/docs/userguide/tutorial_this_and_that.html#sec:configuring_using_external_script) –

+0

@PetrGladkikh 'apply from' esegue immediatamente i compiti esterni. Questo potrebbe non essere preferibile nella logica di esecuzione (ad esempio, vorrei eseguire le attività quando voglio, non subito). –

+0

Questa affermazione nel commento sopra è ** non vera **: 'apply from' esegue immediatamente le attività esterne. Non farti ingannare. Le attività esterne sono configurate, non eseguite. – Jarekczek

risposta

12

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

dettagli qui: Custom Plugins

+0

Solo così sai che il link è rotto - ecco un aggiornamento http://gradle.org/docs/current/userguide/userguide_single.html#sec:configuring_using_external_script – JamesC

+0

Link plugin: http://gradle.org/docs/current/ userguide/userguide_single.html # custom_plugins – JamesC

4

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

Posso presumere che il consolidamento dell'ambiente come progetto multiprogetto dovrebbe fornire l'astrazione che stai cercando.

Nella tua radice del progetto build.gradle di definire tutte le tue cose specifico dominio, così come le cose che si applicano a tutti tuoi sottoprogetti: directory principale

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

Il progetto potrebbe anche contenere un file gradle.properties cui è possibile definire proprietà utilizzate dai vostri progetti:

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

Poi, in un file aggiuntivo dal vostro principale del progetto denominato settings.gradle effettivamente puntare a i 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 sotto-progetto contiene un file di build.gradle contenente solo la roba specifici sotto-progetto.

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

Si noti inoltre che non verrà eseguita alcuna attività di compilazione per la root del progetto se non si carica alcun plug-in oltre il plug-in predefinito a livello di root.

+1

Grazie per aver trovato il tempo di rispondere. Non si tratta di sotto-progetti con cui ho problemi, ma piuttosto di creare una "libreria" di compiti comuni. Ho modificato la mia domanda originale con ulteriori informazioni e frammenti di codice per rendere le cose più chiare. –

+1

Quindi, anziché eseguire l'importazione ("tasks.gradle") dal campione, la sezione dei sottoprogetti {} specifica il codice generico di generazione attività utilizzato da tutti i sottoprogetti. Questo dovrebbe fornire la stessa astrazione che stai cercando !? – Tom

+0

Il plug-in Ivy è davvero necessario qui? Gradle non può essere usato da solo? –

Problemi correlati