Как разобрать и изменить build.gradle.kts Kotlin Gradle build script? - PullRequest
1 голос
/ 20 апреля 2020

Я хочу проанализировать build.gradle.kts (скрипт сборки Gradle в Kotlin), чтобы я мог узнать, какие значения установлены в данный момент, и я также хочу изменить или добавить новые записи в некоторых категориях.

Пример (build.gradle.kts):

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.2.6.RELEASE"
    kotlin("jvm") version "1.3.71"
    etc...
}

group = "net.myProject"
version = "1.0"
java.sourceCompatibility = JavaVersion.VERSION_11

val developmentOnly by configurations.creating
configurations {
    runtimeClasspath {
        extendsFrom(developmentOnly)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-actuator")
    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
    }
    etc...
}

tasks.withType<Test> {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}

В основном это классическое приложение Spring Boot. Я хотел бы иметь возможность:

  1. Получить какое-то структурированное представление файла

  2. Так что я могу добавить фиксированный версия для зависимости (например, реализация ("org.springframework.boot: spring-boot-starter-привод : 2.2.6.RELEASE ")

  3. И поэтому я могу добавить новые зависимости в список зависимостей

Я знаю, что это специальный DSL для скриптов Gradle Build здесь, но где я могу найти это и как можно Я анализирую / использую это?

Спасибо!

1 Ответ

1 голос
/ 20 апреля 2020

К сожалению, kotlin, похоже, не предоставляет свой собственный синтаксический анализатор, что означает, что простого ответа не будет, и вам придется заниматься языковыми обновлениями в дальнейшем. Возможно, вы также захотите убедиться, что проанализированная структура позволяет сохранить пробелы, чтобы сохранить форматирование без изменений.

ktlint может быть интересной отправной точкой. Он использует элементы PSI от IntelliJ, а также повторно использует синтаксический анализатор IntelliJ.

val normalizedText = text.replace("\r\n", "\n").replace("\r", "\n")
val positionByOffset = calculateLineColByOffset(normalizedText)
val fileName = if (script) "file.kts" else "file.kt"
val psiFile = psiFileFactory.createFileFromText(fileName, KotlinLanguage.INSTANCE, normalizedText) as KtFile
val errorElement = psiFile.findErrorElement()
if (errorElement != null) {
    val (line, col) = positionByOffset(errorElement.textOffset)
    throw ParseException(line, col, errorElement.errorDescription)
}
val rootNode = psiFile.node
// use visitor pattern on rootNode

Честно говоря, если это не принесет большую пользу вашему проекту, я постараюсь найти другое решение. Может быть, вы можете прочитать значения в вашем build.gradle.kts из легко разбираемого источника, такого как json файл?

Надеюсь, это поможет.

...