Kotlin DSL : Git Tag auslesen und in eine Variable speichern

8u3631984

Bekanntes Mitglied
Hallo zusammen !
Was habe ich vor :
Ich möchte meine Java - Spring Boot - Software per Git Tags eine Versionsnummer verpassen. Diese soll dann in eine properties Datei geschrieben werden und von einem Service / Controller ausgelesen werden.
Ich verwende zum Bauen der Software Gradle. Aber als DSL verwende ich Kotlin. Mit Groovy habe ich das in einem anderen Projekt bereits gelöst. Aber hier soll nun Kotlin zu Einsatz kommen.

So sah es mit Groovy aus :
Java:
processResources {
    ext.gitVersion = ' git describe --tags --abbrev=0'.execute().text.trim()

    filesMatching("**/projectVersion.properties") {
        expand (
                "projectVersion": ext.gitVersion
        )
    }
}

Wo ist mein Problem :
Mit Kotlin kann man die String execute Funktion aus Groovy so nicht mehr verwenden, Daher mache ich folgendes :
Java:
task<Exec>("projectVersion") {   
    
    commandLine("git", "describe", "--tags", "--abbrev=0")
    standardOutput =  FileOutputStream("version.properties2")

Allerdings wird die Ausgabe (z.B v.0.0.1) "nur" in eine Datei geschrieben. Ich möchte aber die Ausgabe noch ändern, sodass in der Datei zum Schluss soewtas steht :
version: v.0.0.1

Allerdings kann ich nur die Ausgbabe mit dem FileOutputStream in eine Datei umlenken. In eine Variable konnte ich das bisher nicht speichern.

Was habe ich bisher versucht :
Java:
task<Exec>("projectVersion") {   
    standardOutput =  ByteArrayOutputStream()

    doFirst{
        commandLine("git", "describe", "--tags", "--abbrev=0")
    }

    //standardOutput =  FileOutputStream("version.properties2")
    
    doLast{
    val finalString = String(standardOutput.toByteArray())
    println(finalString)
    }

Allerdings bekomme ich folgenden Fehler :
Code:
Smart cast to 'ByteArrayOutputStream' is impossible, because 'standardOutput' is a mutable property that could have been changed by this time

Kann mir jemand helfen
 
Ich habe nun die DSL so angepasst :
Java:
fun getSWVersion() :String  {
    val output =  ByteArrayOutputStream()

    exec{
        commandLine("git", "describe", "--tags", "--abbrev=0")
        standardOutput = output
    }

    return output.toString(StandardCharsets.UTF_8)
}

fun updateVersionProperty() {
    File("$buildDir/libs/version.properties").writeText("swVersion:" + getSWVersion())
}


// project version
task<DefaultTask>("projectVersion") {
    updateVersionProperty()
}

wenn ich nun das Projekt bauen will per gralde clean build oder gradle clean bootJar
bekomme ich den Fehler, dass die Datei :
java-media-cms\build\libs\version.properties (Das System kann den angegebenen Pfad nicht finden)

Ich cermute, dass die Verzeichnisse zu dem Zeitpunkt nicht existieren, denn wenn ich eine andere Datei verwende, die nicht im build Verzeichnis liegt, dann klappt es.

Also daher wäre die konkrete Frage wie kann ich meinen Default Taks erst nach dem Build Taks ausführen ?
 

Zurück
Oben