+-
![如何解析和修改build.gradle.kts Kotlin Gradle构建脚本? 如何解析和修改build.gradle.kts Kotlin Gradle构建脚本?](/img/no_img.png)
我想解析一个 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应用。我希望能做的是
获取文件的某种结构化表示方式。
因此,我可以将一个固定的版本附加到一个依赖关系中(例如 执行("org.springframework.boot:spring-boot-starter-actuator") 2.2.6.释放")
所以我可以将新的依赖关系追加到依赖关系列表中去。
我知道这是Gradle Build Scripts的专用DSL,但我在哪里可以找到这个,我怎么能解析使用它?
谢谢!我想解析一个build.gradle.kts(Gradle构建脚本)。
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文件?
希望能帮到你。