2014-12-29 12 views
7

Sono abbastanza nuovo a lavorare con Gradle e sto cercando di sviluppare un plugin che aiuti a gestire la numerazione delle versioni. Questo plugin definisce un'attività che imposta la proprietà project.version del progetto a cui è applicata.Come posso fare in modo che le estensioni di Gradle valutino pigramente le proprietà impostate dinamicamente dalle attività?

Quello che sto cercando di fare è renderlo tale che questa proprietà sia impostata all'inizio di ogni build di Gradle. Utilizzando Peter's answer to another Gradle question, sono riuscito a eseguire il mio compito prima di qualsiasi altro aggiungendo gradle.startParameter.taskNames = [":setProjectVersionNumber"] + gradle.startParameter.taskNames all'interno del metodo apply del mio plug-in.

Tuttavia, altri plugin (in particolare 'Maven-pubblicare') si basano sulla versione viene specificato durante la fase di configurazione:

publishing { 
    publications { 
     somePublication(MavenPublication) { 
      version = project.version 
     } 
    } 
} 

Quello che mi piacerebbe sapere è se c'è un modo che posso fare la valutazione di proprietà come version all'interno di queste estensioni è la più lenta possibile, in modo che non vengano valutate fino a quando non viene chiamata un'attività che dipende da loro, che in questo caso potrebbe essere :publishToMavenLocal.

seguito è riportato uno SSCCE che dimostra quello che spero di ottenere:

// This would be included within the plugin 
class SetProjectVersionNumber extends DefaultTask { 

    @TaskAction 
    void start() { 
     // This will set project.version during execution phase 
     project.version = "1.2.3" 
     logger.info "Set project version number: $project.version" 
    } 
} 

task setProjectVersionNumber(type: SetProjectVersionNumber) 

// Imagine this block being replaced by a maven 'publishing' block (or something similar) 
ext { 
    version = project.version 

    // This will print 'unspecified', as it's evaluated during configuration phase 
    println "In extension, setting version=$project.version" 
} 

Se è possibile fornire un modo per rendere ext.version uguale 1.2.3 nell'esempio di cui sopra, credo che hai risolto il mio problema.

Se questo è chiedere troppo, potrebbe essere possibile per me far sì che il mio plugin generi la stringa di versione in fase di configurazione piuttosto che in fase di esecuzione. Sarebbe bello sapere se potessi farlo in questo modo, però.

EDIT

In un ramo sperimentale, ho provato a spostare tutte le logiche di assegnazione versione stringa alla configurazione fase (rendendo il tutto accada durante plug applicazione piuttosto che durante l'esecuzione dell'attività), ma don' Credo che ciò funzionerà poiché l'estensione del plugin non è ancora stata elaborata e il tentativo di riferirsi alle proprietà definite in esso non riesce.

EDIT 2

Avvolgere la logica di assegnazione versione stringa in una chiusura project.afterEvaluate sembra aver funzionato:

@Override 
public void apply(Project project) { 
    logger = project.logger 
    project.extensions.create(EXTENSION_NAME, SemVerPluginExtension) 

    project.afterEvaluate { 
     setVersionProjectNumber(project) 
     addTasks(project) 
    } 
} 

In un progetto finto, implemento build.gradle come segue:

apply plugin: 'semver' 
apply plugin: 'maven-publish' 

group = 'temp' 

buildscript { 
    repositories { 
     mavenLocal() 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.github.tagc:semver-plugin:0.2.2' 
    } 
} 

semver { 
    versionFilePath = 'version.properties' 
} 

publishing { 
    publications { 
     testPublication(MavenPublication) { 
      version = project.version 
      assert version 
      println "Set publication version to $version" 
     } 
    } 
} 

Per qualche motivo, questo sembra funzionare. Anche se la logica di assegnazione versione stringa è avvolto in chiusura un 'afterEvaluate' e l'assegnazione versione di pubblicazione di prova non è, l'ex si verifica ancora prima che quest'ultimo:

Compiling build file '/Users/davidfallah/Documents/semver/TestSemver2/build.gradle' using StatementExtractingScriptTransformer. 
Compiling build file '/Users/davidfallah/Documents/semver/TestSemver2/build.gradle' using BuildScriptTransformer. 
VERSION FILE PATH=version.properties 
Current Git branch: develop 
Set project version to 0.2.1-SNAPSHOT 
Set publication version to 0.2.1-SNAPSHOT 
All projects evaluated. 

sto lasciando aperta la questione irrisolta e da quando ho Mi piacerebbe ancora sapere se è possibile farlo nel modo che inizialmente intendevo. Inoltre, gradirei qualsiasi spiegazione sul motivo per cui la versione della pubblicazione è stata assegnata dopo che è stata impostata la versione del progetto, e se posso dipendere da quello che è sempre il caso o che sta accadendo ora per caso.

risposta

1

È possibile utilizzare lazy instantiation of GStrings per valutare le proprietà in fase di esecuzione:

project.tasks.create("example_task", Exec.class, { 
    commandLine 'echo', "${-> project.someproperty}" 
}) 

Si noti che è necessario utilizzare le virgolette e non apostrofi - "${...}" opere, ma '${...}' non lo fa.

+0

Cheers. L'ho chiesto così tanto tempo fa che ho quasi dimenticato il linguaggio e tanto meno lavorare ancora a questo progetto per testarlo, ma sembra plausibile che dovrebbe funzionare. – Tagc