GString ленивая оценка в Kotlin DSL с использованием плагина gradle- git -properties - PullRequest
0 голосов
/ 18 марта 2020

Я использую Gradle 6.2.2 с этим плагином: com.gorylenko.gradle-git-properties (версия 2.2.2). Я пытаюсь "перевести" следующий фрагмент в Kotlin DSL:

gitProperties {
  extProperty = "gitProps" // git properties will be put in a map at project.ext.gitProps
}

shadowJar {
  manifest {
    attributes(
      "Build-Revision": "${ -> project.ext.gitProps["git.commit.id"]}"  // Uses GString lazy evaluation to delay until git properties are populated
    )
  }
}

... но это то, что я до сих пор придумал:

gitProperties {
  extProperty = "gitProps"
  keys = listOf("git.branch", "git.build.host", "git.build.version", "git.commit.id", "git.commit.id.abbrev",
      "git.commit.time", "git.remote.origin.url", "git.tags", "git.total.commit.count")
}

tasks {
  withType<ShadowJar> {
    manifest.attributes.apply {
      put("Build-Revision", "${project.ext.properties["git.commit.id"]}")
    }
  }
}

Я не могу придумать, чтобы часть «GString lazyvaluation» работала в Kotlin DSL, ни как карта gitProps подходит здесь; в конце концов этот подход (который я знаю, что это частично неправильно) возвращает null. Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Следующий синтаксис Kotlin работал для меня:

put("Build-Revision", object {
  override fun toString():String = (project.extra["gitProps"] as Map<String, String>)["git.commit.id"]!!
})
1 голос
/ 18 марта 2020

Я думаю, что у вас есть некоторая путаница относительно того, где и как хранятся данные, и в частности , когда доступно.

Я только что получил этот плагин и посмотрел на он: он предоставляет расширение проекта, которое вы конфигурируете, чтобы указать, почему свойство extras заполняется, и задачу: «generateGitProperties». Эта задача добавляется в качестве зависимости для задачи «классы», поэтому она уже запускается, когда вы переходите к «shadowJar»

. Проблема в том, что определение свойств git и заполнение дополнительных свойств происходит только тогда, когда эта задача выполнена , поэтому они недоступны, когда сборка настроена , поэтому для ленивых shenanigans GString требуется передать ленивое значение в конфигурацию shadowJar, которая будет только оценивать после выполнения shadowJar.

Вы можете получить дополнительные свойства, например:

tasks.register("example") {
    dependsOn("generateGitProperties")
    doFirst {
        val gitProps: Map<String, String> by project.ext
        for ((name, value) in gitProps) {
            println("GIT: $name -> $value")
        }
    }
}

Это работает, потому что оно находится в блоке "doFirst", поэтому происходит во время выполнения задачи. , а не время конфигурации. По сути, вы могли бы подражать "ленивому GString" материалу. Примерно так:

withType<Jar>().configureEach {
    val lazyCommitId = object {
        override fun toString(): String {
            val gitProps: Map<String, String> by project.ext
            return gitProps["git.commit.id"] ?: ""
        }
    }

    manifest {
        attributes["Git-Commit-Id"] = lazyCommitId
    }
}

Я сделал это только для «jar», но «shadowJar» в любом случае является лишь подтипом задачи Jar.

...