如何解析和修改build.gradle.kts Kotlin Gradle构建脚本?

问题描述 投票:1回答:1

我想解析一个 build.gradle.kts (Kotlin中的Gradle构建脚本),所以我可以找出当前设置的值,我也想修改或添加一些类别的新条目。

例如(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-actuator") 2.2.6.释放")

  3. 所以我可以将新的依赖关系追加到依赖关系列表中去。

我知道这是Gradle Build Scripts的专用DSL,但我在哪里可以找到这个,我怎么能解析使用它?

谢谢!我想解析一个build.gradle.kts(Gradle构建脚本)。

spring parsing kotlin gradle gradle-kotlin-dsl
1个回答
1
投票

不幸的是,kotlin似乎没有提供自己的解析器,这意味着不会有一个简单的答案,你将不得不处理语言更新的问题。你可能还需要确保解析后的结构允许你保留空白,以保持格式化的完整性。

ktlint 可能是一个有趣的起点。它使用了IntelliJ的PSI-Elements,并重用了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文件?

希望能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.