Получить версию в коде Kotlin / Java в проекте Gradle - PullRequest
0 голосов
/ 01 мая 2018

У меня есть веб-сервис, закодированный в kotlin и управляемый gradle для сборки / зависимостей и т. Д. *

Я хочу сделать простую вещь: когда кто-то вызывает конечную точку version REST моего веб-сервиса, он возвращает версию.

Поскольку gradle уже обрабатывает версию со свойствами version в build.gradle, я подумал, что будет легко получить это значение, но, похоже, это не так ... Я искал в Google несколько часов, и все кажется так сложно.

Есть идеи, как правильно обращаться с версией?

Вот что у меня сейчас есть:

build.gradle

version = "1.0.0"
...

StatusService.kt

class StatusService : IStatusService {

    //TODO: Here I would like to get the version from the gradle 
    //file instead of maintaining 2 places for the version
    //Something like Gradle.getProperties("version") for example
    override fun getVersion() : String = "1.0.0"

}

Я могу быть совершенно неправ в этом, поэтому, если у вас есть другое эквивалентное решение, я его тоже приму! Спасибо

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Один из подходов к этому состоит в том, чтобы вывести файл версии как часть вашей сборки Gradle в местоположение в вашем classpath, которое доступно как ресурс в вашем приложении.

Например:

Вы можете добавить это в свой файл build.gradle, который сгенерирует файл свойств, содержащий номер версии проекта, и добавит его в исходный набор приложений, чтобы он был доступен в пути к классам.

def generatedVersionDir = "${buildDir}/generated-version"

sourceSets {
    main {
        output.dir(generatedVersionDir, builtBy: 'generateVersionProperties')
    }
}

task generateVersionProperties {
    doLast {
        def propertiesFile = file "$generatedVersionDir/version.properties"
        propertiesFile.parentFile.mkdirs()
        def properties = new Properties()
        properties.setProperty("version", rootProject.version.toString())
        propertiesFile.withWriter { properties.store(it, null) }
    }
}
processResources.dependsOn generateVersionProperties

Тогда в вашем коде вы сможете получить к нему доступ, прочитав в файле свойств:

class StatusService : IStatusService {
    private val versionProperties = Properties()

    init {
        versionProperties.load(this.javaClass.getResourceAsStream("/version.properties"))
    }

    override fun getVersion() : String = versionProperties.getProperty("version") ?: "no version"
}

Конечно, вам может показаться, что проще и уместнее просто вывести строку в файл версии, а затем прочитать весь код как строку в вашем коде вместо использования файла свойств.

0 голосов
/ 03 мая 2018

Рассмотрим простой Kotlin Пример Spring Boot:

@SpringBootApplication
@RestController
class DemoApplication {
    @Value("\${version}")
    private lateinit var version: String

   @GetMapping("/version")
   fun version() = version
}

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}

Поскольку свойство может быть взято из application.properties , нам нужно сгенерировать этот файл с требуемой версией. Для этого мы можем создать файл свойств шаблона со следующим содержимым:

version=###appVersion

Теперь давайте скажем Gradle скопировать этот шаблон в папку resource и поместить версию вместо заполнителя

import org.apache.tools.ant.filters.ReplaceTokens

task preprocessProperties(type: Copy) {
    from 'src/main/resources/templates'
    into 'src/main/resources'
    include 'template.properties'
    rename 'template.properties', 'application.properties'
    filter(ReplaceTokens, beginToken: '###', endToken: '', tokens: [appVersion: '1.0.0'])
}

compileKotlin.dependsOn preprocessProperties

И, вуаля, каждый раз, когда вы компилируете Kotlin источников, вы получаете файл свойств с нужной вам версией.

0 голосов
/ 01 мая 2018

Gradle присутствует только при компиляции, а не во время выполнения.

Для этого вы должны сгенерировать класс во время компиляции.
В проекте Android создается файл BuildConfig.java, но я не знаю, Gradle или Android.

Для генерации кода Kotlin вы можете проверить KotlinPoet .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...