Wie kann ich festlegen, dass Gradle-Erweiterungen Eigenschaften, die dynamisch von Tasks festgelegt werden, träge auswerten?

Ich bin ziemlich neu in der Arbeit mit Gradle und versuche, ein Plugin zu entwickeln, mit dem die Versionsnummerierung verwaltet werden kann. Dieses Plugin definiert eine Aufgabe, die das @ setproject.version Eigenschaft des Projekts, auf das es angewendet wird.

Ich versuche es so zu machen, dass diese Eigenschaft zu Beginn jedes Gradle-Builds festgelegt wird. @ Verwend Peter Antwort auf eine andere Frage Gradle, Ich habe es geschafft, meine Aufgabe durch Hinzufügen von @ vor allen anderen auszuführegradle.startParameter.taskNames = [":setProjectVersionNumber"] + gradle.startParameter.taskNames in meinem Pluginapply Methode

Andere Plugins (insbesondere 'Maven-publish') hängen jedoch von der Version ab, die während der Konfigurationsphase angegeben wurde:

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

Was ich gerne wissen würde, ist, ob es eine Möglichkeit gibt, Eigenschaften wie @ zu bewerteversion innerhalb dieser Erweiterungen so faul wie möglich - so dass sie erst ausgewertet werden, wenn eine von ihnen abhängige Aufgabe aufgerufen wird. In diesem Fall kann dies @ sei:publishToMavenLocal.

Below ist eine SSCCE, die zeigt, was ich mir erhoffe:

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

Wenn Sie einen Weg bereitstellen können, um @ zu machext.version gleich1.2.3 im obigen Beispiel glaube ich, dass Sie mein Problem behoben haben.

Wenn dies zu viel verlangt, kann es sein, dass mein Plugin die Versionszeichenfolge zur Konfigurationszeit und nicht zur Ausführungszeit generiert. Es wäre allerdings schön zu wissen, ob ich es so machen könnte.

BEARBEITE

In einem experimentellen Zweig habe ich versucht, die gesamte Zuweisungslogik für die Versionszeichenfolge in die Konfigurationsphase zu verschieben (indem alles während der Plugin-Anwendung und nicht während der Task-Ausführung ausgeführt wurde), aber ich glaube nicht, dass dies so funktioniert wie die Plugin-Erweiterung Noch nicht verarbeitet und der Versuch, auf darin definierte Eigenschaften zu verweisen, schlägt fehl.

EDIT 2

Versionsstring-Zuweisungslogik in ein @ einwickeproject.afterEvaluate Closure scheint funktioniert zu haben:

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

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

n einem Scheinprojekt implementiere ichbuild.gradle wie folgt

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

Aus irgendeinem Grund scheint dies zu funktionieren. Obwohl die Zuweisungslogik für die Versionszeichenfolge in einen 'afterEvaluate'-Abschluss eingeschlossen ist und die Versionszuweisung für die Testpublikation nicht, tritt die erste noch vor der zweiten auf:

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.

Ich lasse diese Frage offen und ungelöst, da ich immer noch wissen möchte, ob es möglich ist, es so zu machen, wie ich es ursprünglich beabsichtigt hatte. Darüber hinaus würde ich mich über jede Erklärung freuen, warum die Veröffentlichungsversion zugewiesen wird, nachdem die Projektversion festgelegt wurde, und ob ich mich darauf verlassen kann, dass dies immer der Fall ist oder ob dies nur zufällig geschieht.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage