2014-12-29 13 views
7

Jestem całkiem nowy w pracy z Gradle i staram się opracować wtyczkę, która pomaga zarządzać numerowaniem wersji. Ta wtyczka definiuje zadanie, które ustawia właściwość projektu, do którego jest stosowane.Jak mogę tworzyć rozszerzenia Gradle leniwie oceniać właściwości, które są ustawione dynamicznie według zadań?

Próbuję to zrobić, aby ta własność została ustawiona na początku każdej kompilacji Gradle. Korzystając z Peter's answer to another Gradle question, udało mi się wykonać to zadanie przed innymi, dodając gradle.startParameter.taskNames = [":setProjectVersionNumber"] + gradle.startParameter.taskNames w mojej metodzie wtyczki apply.

Jednak inne wtyczki (zwłaszcza „Maven publikuje”) opierają się na wersji jest określona w fazie konfiguracji:

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

Co chciałbym wiedzieć, czy istnieje sposób, że mogę zrobić ocena właściwości, takich jak version w tych rozszerzeniach, tak leniwych, jak to możliwe - tak, że nie są one oceniane, dopóki nie zostanie wywołane zadanie od nich zależne, które w tym przypadku może być :publishToMavenLocal.

Poniżej znajduje się SSCCE który pokazuje, co mam nadzieję osiągnąć:

// 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" 
} 

Jeśli można podać sposób, aby ext.version równe 1.2.3 w przykładzie powyżej, uważam, że udało Ci się rozwiązać mój problem.

Jeśli to zbyt wiele, może się zdarzyć, że moja wtyczka wygeneruje ciąg wersji w czasie konfiguracji zamiast w czasie wykonywania. Byłoby miło wiedzieć, czy mógłbym to zrobić w ten sposób.

EDIT

W gałęzi eksperymentalnej, próbowałem przesuwając całą logikę zadanie wersja ciąg konfiguracji fazy (poprzez to wszystko się stało podczas plugin aplikacji niż podczas wykonywania zadań), ale don” Sądzimy, że to zadziała, ponieważ rozszerzenie wtyczki nie zostało jeszcze przetworzone i próba odwołania do zdefiniowanych w nim właściwości kończy się niepowodzeniem.

EDIT 2

Owijanie logiki przydziału wersja ciąg w zamknięciu project.afterEvaluate wydaje się, że pracował:

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

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

W pozorowanej projektu wdrożyć build.gradle następująco:

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" 
     } 
    } 
} 

Z jakiegoś powodu wydaje się, że to działa. Choć logika przypisanie wersja ciąg jest zapakowane w zamknięciu danej „afterEvaluate” i przypisanie publikacja wersja testowa nie jest, były nadal występuje przed ostatnia:

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. 

Zostawiam to pytanie otwarte i nierozwiązane od I Nadal chciałbym wiedzieć, czy można to zrobić tak, jak pierwotnie zamierzałem. Dodatkowo doceniłbym wszelkie wyjaśnienia, dlaczego wersja publikacji jest przypisana po ustawieniu wersji projektu i czy mogę na tym polegać, czy też dzieje się to teraz przez przypadek.

Odpowiedz

1

Można użyć lazy instantiation of GStrings ocenić właściwości w czasie wykonywania:

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

Zauważ, że musisz użyć cudzysłowu i nie apostrof - "${...}" działa, ale '${...}' nie.

+0

Pozdrawiam. Zapytałem to już dawno temu, że w połowie zapomniałem języka, nie mówiąc już o pracy nad tym projektem, aby to przetestować, ale wydaje się prawdopodobne, że to powinno zadziałać. – Tagc